什么时候strcmp不会返回-1,0或1?

bea*_*mit 2 c strcmp

从手册页:

所述的strcmp()和STRNCMP()函数返回小于整数,等于或大于零,如果S1(或其前n个字节)被发现,分别为小于,以匹配或大于s2 .

实施例中的代码C(打印-15我的机器上,交换TEST1和TEST2反转值):

#include <stdio.h>
#include <string.h>

int main() {
    char* test1 = "hello";
    char* test2 = "world";
    printf("%d\n", strcmp(test1, test2));
}
Run Code Online (Sandbox Code Playgroud)

我发现这个代码(取自这个问题)依赖于strcmp的值不是-1,0和1(它使用返回值qsort).对我来说,这是一种可怕的风格,取决于无证的功能.

我想我有两个相关的问题:

  • C标准中是否有某些内容定义了返回值除了小于,大于或等于零之外的值?如果没有,标准实现有什么作用?
  • 整个Linux,Windows和BSD的返回值是否一致?

编辑:

离开我的电脑5分钟后,我意识到问题代码实际上没有错误.在阅读评论/答案之前,我找出了我想出的部分,但是我把它留在那里以保持评论的相关性.我认为这仍然是一个有趣的问题,可能会导致习惯于其他语言的程序员总是返回-1,0或1(例如Python似乎这样做,但是没有记录这种方式).

FWIW,我认为依赖记录行为以外的其他东西是不好的风格.

小智 7

C标准中是否有某些内容定义了返回值除了小于,大于或等于零之外的值?

不会.最严格的限制是它应该为零,小于零或大于零,如此特定功能文档中所指定的那样.

如果没有,标准实现有什么作用?

没有"标准实施"这样的东西.即使有,也可能只是

return zero, less than zero or more than zero;
Run Code Online (Sandbox Code Playgroud)

:-)

整个Linux,Windows和BSD的返回值是否一致?

从10.7.4开始,我可以确认它在Linux和OS X中是一致的(具体来说,它是-1,0或+1).我不知道Windows,但我打赌微软的人使用-2和+3只是为了打破代码:P

另外,我还要指出,你完全误解了代码的作用.

我发现这个代码(取自这个问题)依赖于strcmp的值不是-1,0和1(它使用qsort中的返回值).对我来说,这是一种可怕的风格,取决于无证的功能.

不,它实际上没有.C标准库在设计时考虑了一致性和易用性.也就是说,qsort()需要的是它的比较器函数返回一个负数或正数或零 - 这strcmp()正是保证要做的.所以这不是"糟糕的风格",它是完全符合标准的代码,不依赖于未记录的功能.

  • 如果某人依赖于`strcmp`返回-2或+3那么他/她的代码应该被打破.;-) (2认同)

Omk*_*ant 5

在C99标准中,\xc2\xa77.21.4.2strcmp函数

\n\n
\n

strcmp当 指向的字符串大于、等于或小于指向的字符串时,该函数相应地返回s1一个大于、等于或小于零的整数s2

\n
\n\n

添加了强调。

\n\n

这意味着该标准不保证-1,01; 它可能会根据操作系统的不同而有所不同。

\n\n

您获得的值是wh之间的差值15

\n\n

在你的情况下hello,这就是返回-15的原因。world\'h\'-\'w\' = -15 < 0strcmp

\n