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

时间:2016-02-13 07:27:52

标签: c++ c strcmp

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

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

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

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

我首先想到它会返回-1,但事实证明它返回数字<如果第一个字符串较小,则为0。那么有人可以告诉我如何检查strcmp是否失败。

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

4 个答案:

答案 0 :(得分:13)

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

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

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

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

答案 1 :(得分:7)

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

的内容
  

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

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

strcmp才返回0。

如果两者不完全相同,则返回非零值。如果返回值为负,则表示第一个字符串在词典排序中排在第一位;如果是正数,则意味着第二个字符串在字典排序中排在第一位。

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