C语言中strcmp()函数的返回值是什么?

22
我正在学习C语言中的strcmp()函数。我知道当两个字符串相等时,strcmp()函数返回0。
但是,当man手册上说当第一个字符串小于第二个字符串时,strcmp()函数返回值小于0,它指的是长度、ASCII值还是其他什么?
5个回答

27

在这个意义上,字符串的“小于”表示按字典顺序(即字母顺序)排序。

因此,cat小于dog,因为cat在字典上排在dog之前。

字典顺序在某种程度上是将所有ASCII(和UNICODE)字符扩展到字母顺序的一种方式。


1
从这个答案中,有人可能会认为strcmp()知道Unicode。但事实并非如此。 - Prof. Falken
1
@Amigable Clark Kant:对于Unicode,我隐含地指的是strcmp()的宽字符版本。但是,是的,我明白你的意思。 - Mysticial

8

如果返回值大于零,表示第一个不匹配的字符在第一个字符串中的值大于在第二个字符串中的值;如果返回值小于零,则相反。


6

C99 7.21.4:

比较函数memcmpstrcmpstrncmp返回的非零值的符号由被比较对象中第一对不同字符(都解释为unsigned char)之间的差异符号确定。

特别注意,结果不依赖于当前语言环境;LC_COLLATE(见C99 7.11)影响strcoll()strxfrm(),但不影响strcmp()


2
    int strcmp (const char * s1, const char * s2)
    {
        for(; *s1 == *s2; ++s1, ++s2)
           if(*s1 == 0)
               return 0;
        return *(unsigned char *)s1 < *(unsigned char *)s2 ? -1 : 1;
    }

12
如果你能解释为什么这个回答是正确的,那么你的回答会更好。 - Ben
这也是错误的答案,1/-1不符合C标准。而且在解除引用之前你没有进行检查。 - Tomas Pruzina
在Ubuntu 14.04上,gcc不会返回-1或1。它会返回(*s1 - *s2)。 - Scooter

-2
请看下面的程序,我将根据您输入的字符串返回相应的值。函数strcmp会根据整个字符串的ASCII值进行比较。
例如:str1 = "aab"str2 = "aaa"将返回1,因为aab>aaa。
int main()
{
    char str1[15], str2[15];
    int n;
    printf("Enter the str1 string: ");

    gets(str1);
    printf("Enter the str2 string : ");
    gets(str2);
    n = strcmp(str1, str2);
    printf("Value returned = %d\n", n);
    return 0;
}

2
欢迎来到stackoverflow,感谢您的回答。请注意,这个问题已经在两年前被回答过了,并且有一个不错的被采纳的答案。另外,您的回答并没有真正回答原问题。 - Itay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接