我不明白 strcmp 结果

I do not understand strcmp results

这是我对 strcmp 的实现,

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

   int ft_strcmp(const char *s1, const char *s2)
   {
       while (*s1 == *s2)
       {
           if (*s1 == '[=10=]')
              return (0);
          s1++;
          s2++;
      }
      return (*s1 - *s2);
  }

  int main()
  {
      char    s1[100] = "bon";
      char    s2[100] = "BONN";
      char    str1[100] = "bon";
      char    str2[100] = "n";
      printf("%d\n", ft_strcmp(s1, s2));
      printf("%d\n", ft_strcmp(str1, str2));
      return (0);
  }

来自 kernighan 和 Ritchie 一书,但我使用 while 循环而不是 for,我已经对其进行了多次测试并且我的 strcmp 得到了与原始 strcmp 相同的结果, 但我不明白结果,我骑了那个人: "The strcmp() and strncmp() functions lexicographically compare the null-terminated strings s1 and s2." 词典编纂是什么意思? "return an integer greater than, equal to, or less than 0, according as the string s1 is greater than, equal to, or less than the string s2." 我理解这部分,但我的问题是它是如何得出这样的结果的:

32
-12

s1 对我来说看起来 < s2 那么我如何以及为什么得到 32 以及如何进行计算? str1 对我来说看起来 > str2,我如何以及为什么得到 -12 以及如何进行计算。 我用真正的 STRCMP 编译它,我得到了相同的结果..

最后一个问题为什么我需要比较 *s1 和 '\0' 如果没有它就不能正常工作吗?

谢谢你的回答我很困惑..

1) K&R 正在比较这些字符的 ascii 值,这就是为什么你得到 32 和 -12,看看 ascii table 你就会明白了。

2)如果你不检查 \0 ,你怎么知道字符串何时结束?那是 c 字符串终止符。

ASCII 码中的大写字母实际上在小写字母之前,如您所见here

所以在字典序上,s1被视为比s2大,因为第一个不同的字母的ascii值更大。

所以我们将 *s1 与 '\0' 进行比较以查看字符串何时结束, 结果是使用每个字符串的第一个字符的十进制值得出的。

int ft_strcmp(char *s1,char *s2)
{
    int x;

    x = 0;
    while(s1[x] != '[=10=]' && s2[x] != '[=10=]' && s1[x] == s2[x])
        i++;
    return (s1[x] - s2[x]);
}

来自雪盟友