如何检查 `strcmp` 是否失败?

How to check if `strcmp` has failed?

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

我遇到了这个 link:C library function - strcmp()

这里解释了 strcmp 的 return 值。我知道每一个功能,无论多么安全,都可能会失败。因此,我知道即使 strcmp 有时也会失败。

此外,我遇到了 问题,该问题也解释了 strcmp 的 return 值。搜索了很多之后,我找不到解释如何检查 strcmp 是否会失败的网站。

我最初以为它会 return -1,但结果是 returns numbers < 0 如果第一个字符串较小。那么谁能告诉我如何检查 strcmp 是否失败。

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

strcmp returns 0 当且仅当两个字符串正确地以零终止,并且具有完全相同的字符。

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

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

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

的内容

The behavior is undefined if lhs or rhs are not pointers to null-terminated strings.

这意味着它可能会崩溃,或者导致红色的小恶魔从你的鼻子里飞出来,或者其他什么。由于未定义的行为可能是您天真地认为会发生的事情(如您所见,没有错)发生了,因此没有可靠的方法来识别它。虽然你会认出崩溃。

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

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

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

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

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

但在这种情况下 strcmp 完全不保证其行为 — 它被允许只是开始擦除您的硬盘,或从您的电子邮件帐户发送垃圾邮件,或诸如此类 — 所以它不会需要明确指出错误。 (实际上,在典型的 C 或 C++ 实现中,strcmp 真正 可以 检测和处理的唯一一种无效参数是空指针情况,您可以就像在调用 strcmp 之前轻松检查一样。所以错误指示器不会有用。)

可能的失败是未定义的行为,如果您提供错误的参数可能会发生
(不是指向空终止字符串的指针)。