如何检查“strcmp”是否失败

How to check if `strcmp` has failed?

本文关键字:strcmp 是否 失败 何检查 检查      更新时间:2023-10-16

这个问题是关于C和C++的,因为strcmp都存在于它们中。

我遇到了这个链接:C 库函数 - strcmp((。

在这里解释了strcmp的返回值。我知道每个功能,无论它有多安全,都可能失败。因此,我知道即使是strcmp也可能在某个时候失败。

另外,我遇到了这个问题,它也解释了strcmp的返回值。搜索了很多之后,我找不到一个解释如何检查strcmp是否会失败的网站。

我最初想到它会返回 -1,但事实证明,如果第一个字符串较小,它会返回 <0 的数字。所以有人可以告诉我如何检查strcmp是否失败了。

编辑:好吧,我不明白strcmp不失败的意义。函数失败的方式有很多种。例如,在一条评论中,写道如果堆栈不扩展,则可能会导致堆栈过低。任何语言的任何程序都不是绝对安全的!

没有定义的情况,strcmp可能会失败。

您可以通过传递无效参数来触发未定义的行为,例如:

  • 空指针
  • 未初始化的指针
  • 指向已释放的内存的指针,或指向已退出函数的堆栈位置的指针,或类似内容
  • 一个完全有效的指针,但在指针指向的位置和它指向的分配内存范围的末尾之间没有空字节

但在这种情况下,strcmp绝对不保证它的行为 - 它被允许开始擦除你的硬盘驱动器,或者从你的电子邮件帐户发送垃圾邮件,或者什么你 - 所以它不需要明确指出错误。(事实上,在典型的 C 或 C++ 实现中,strcmp真正可以检测和处理的唯一一种无效参数是空指针情况,您可以在调用 strcmp 之前轻松检查它。因此,错误指示器将没有用。

如果您在某些文档中查找strcmp,您会发现类似

"> 如果 lhs 或 rhs 不是指向以 null 结尾的字符串的指针,则行为未定义。

这意味着它可能会崩溃,或者导致小的红色守护进程从你的鼻子里飞出来,或者其他什么。由于未定义的行为可能是你无辜地认为会发生的事情(正如你所看到的那样没有错(,所以没有确定的方法来识别它。虽然你会认出崩溃。

因此,作为程序员,您无法在事后检查未定义的行为。

但是编译器可以为您添加此类检查,针对包括此在内的许多未定义行为,因为它完全负责该行为。它是否会这样做取决于编译器。此外,您可以在例如包装器函数中添加检查,以最大程度地减少未定义行为的机会,尽管对于未终止的字符串,没有实用的方法来检查我知道它本身不会调用未定义的行为。

可能的失败是未定义的行为,如果您给出错误的参数
(而不是指向以 null 结尾的字符串的指针(,可能会发生失败。

当且仅当两个字符串正确以零结尾并且具有完全相同的字符时,strcmp返回 0。

如果它们不完全相同,则返回非零值。如果返回值为负数,则表示第一个字符串在字典顺序中排在第一位;如果为正,则表示第二个字符串在字典顺序中排在第一位。

没有"失败",除了可能的未定义行为,如果提供了无效的输入 - 那么任何事情都可能发生,包括程序崩溃或编译器生成无效代码。