【问题标题】:strcmp() return values in C [duplicate]C中的strcmp()返回值[重复]
【发布时间】:2011-12-01 04:07:10
【问题描述】:

我正在学习 C 语言中的 strcmp()。我知道当两个字符串相等时,strcmp 返回 0。

但是,当手册页指出strcmp 在第一个字符串小于第二个字符串时返回小于 0 时,它指的是长度、ASCII 值还是其他什么?

【问题讨论】:

    标签: c strcmp


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      所以cat 小于dog,因为cat 按字母顺序排列在dog 之前。

      在某种意义上,字典顺序是字母顺序对所有 ASCII(和 UNICODE)字符的扩展。

      【讨论】:

      • 从这个答案有人可能会相信 strcmp() 知道 unicode。事实并非如此。
      • @Amigable Clark Kant:对于 unicode,我隐含地指的是 strcmp() 的宽字符版本。但是,是的,我明白你的意思。
      【解决方案3】:

      C997.21.4:

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

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

      【讨论】:

        【解决方案4】:
            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;
            }
        

        【讨论】:

        • 如果你能解释一下为什么这回答了这个问题,你的答案会好很多。
        • 这也是错误的答案,1/-1 不符合 C 标准。而且您在取消引用之前不进行检查。
        • 在 Ubuntu 14.04 上 gcc 没有返回 -1 或 1。它返回 (*s1 - *s2)
        【解决方案5】:

        看下面的程序,这里我根据你输入的字符串返回值。函数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;
        }
        

        【讨论】:

        • 欢迎来到stackoverflow,感谢您的回答。请注意,这个问题是在两年多前回答的,并且有一个不错的接受答案。此外,您的回答并没有真正回答原始问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多