如何检查“strcmp”是否失败
How to check if `strcmp` has failed?
这个问题是关于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。
如果它们不完全相同,则返回非零值。如果返回值为负数,则表示第一个字符串在字典顺序中排在第一位;如果为正,则表示第二个字符串在字典顺序中排在第一位。
没有"失败",除了可能的未定义行为,如果提供了无效的输入 - 那么任何事情都可能发生,包括程序崩溃或编译器生成无效代码。
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 此代码是否违反一个定义规则
- 是否需要删除包含对象的"pair"?
- 是否可以从int转换为enum类类型
- 无论条件是否为true,if总是在c++中执行
- 如何找到大小'x'数组是否完全填充,在C++?
- 检查值是否在集合p1和p2中,但不在p3中
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 如何检查“strcmp”是否失败
- 字符串:使用 strcmp 查找第一个单词是否重复
- 如果第二个参数"0",strcmp 是否C++检查字符串中的每个值?