【问题标题】:What exactly is strcmp(String comparison) doing?strcmp(字符串比较)到底在做什么?
【发布时间】:2016-10-27 00:25:55
【问题描述】:

我下面测试strcmp的代码如下:

char s1[10] = "racecar";
char *s2 = "raceCar";     //yes, a capital 'C'
int diff;
diff = strcmp(s1,s2);
printf(" %d\n", diff);

所以我对为什么输出是 32 感到困惑。究竟是什么比较才能得到这个结果?感谢您的宝贵时间和帮助。

【问题讨论】:

标签: c strcmp


【解决方案1】:

随心所欲。在这种情况下,您获得的值似乎是 'c' - 'C' (字符串不同的第一个点的两个字符之间的差异),在许多系统上等于 32,但您不应该意味着依靠它。您唯一可以指望的是,如果两个字符串相等,则返回值为 0,如果 s1 在 s2 之前返回负数,如果 s1 在 s2 之后返回正数。

【讨论】:

    【解决方案2】:

    手册页指出,如果字符串不同,输出将大于 0 或小于 0。它没有说明关于确切值的任何其他信息(如果不是 0)。

    话虽如此,c 和 C 的 ASCII 码相差 32。这可能就是结果的来源。但是,您不能依赖这种行为在任何两个给定的实现中都是相同的。

    【讨论】:

      【解决方案3】:

      未指定。按标准:

      7.24.4.2 strcmp 函数

      #include <string.h>
      int strcmp(const char *s1, const char *s2);
      

      说明

      strcmp 函数将s1 指向的字符串与s1 指向的字符串进行比较 s2.

      退货

      strcmp 函数返回一个大于、等于或小于零的整数, 因此,s1 指向的字符串大于、等于或小于s2 指向的字符串。

      【讨论】:

        【解决方案4】:

        根据C标准(N15707.24.4.2):

        strcmp 函数返回一个大于、等于、 或小于零,因此 s1 指向的字符串是 大于、等于或小于指向的字符串 s2

        它没有说明如果字符串不相等将返回哪个正值或负值,可移植代码只应检查结果是否小于、等于或大于零。

        话虽如此,strcmp 的直接实现可能会在不匹配的第一个字符的值中返回数字差异。在您的情况下,第一个不匹配的字符是 'c''C',它们在 ASCII 中恰好相差 32。

        不要指望这个。

        【讨论】:

          【解决方案5】:

          "strcmp" 比较字符串,当它到达不同的字符时,它会返回它们之间的差异。

          在你的情况下,它在你的第一个字符串中达到 'c',在你的第二个字符串中达到 'C'。十六进制的“c”是 0x63,而“C”是 0x43。相减得到 0x20,即十进制的 32。

          如果函数返回0,我们使用strcmp来检查字符串是否相等。

          【讨论】:

            【解决方案6】:

            strcmp 逐个字符比较字符串,直到到达不匹配的字符或终止的空字符。

            所以 strcmp 函数看到 c(在 ASCII 中是 99)大于 C(在 ascii 中是 67),所以它返回一个正整数。我认为它返回的任何正整数通常由您的系统或您正在编译的任何版本的 c 定义。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-07-21
              • 2019-06-19
              • 2013-03-12
              • 1970-01-01
              相关资源
              最近更新 更多