我不明白strcmp的结果

我不明白strcmp的结果,c,strcmp,string.h,C,Strcmp,String.h,这是我对strcmp的实现 #include <stdio.h> #include <string.h> int ft_strcmp(const char *s1, const char *s2) { while (*s1 == *s2) { if (*s1 == '\0') return (0); s1++; s2++;

这是我对strcmp的实现

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

   int ft_strcmp(const char *s1, const char *s2)
   {
       while (*s1 == *s2)
       {
           if (*s1 == '\0')
              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);
  }
s1对我来说看起来小于s2,那么我怎么得到32,为什么得到32,以及结石是如何形成的? 对于我来说,str1看起来>str2,我是如何得到-12的,为什么得到-12,以及结石是如何产生的。 我用真正的STRCMP编译了它,得到了同样的结果

最后一个问题:为什么我需要将*s1与'\0'进行比较?如果没有它,它是否可以正常工作

谢谢你的回答,我很困惑。

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


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

ASCII码中的大写字母实际上位于小写字母之前,正如您所看到的


因此,在词典排序方面,
s1
被视为大于
s2
,因为第一个不同字母的ascii值较大。

因此,我们将*s1与'\0'进行比较,以查看字符串何时结束, 并且使用每个字符串的第一个字符的十进制值生成结果

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

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

通过mokgohloa ally

我查看了ascii表,我尝试使用八进制或十进制进行计算,但没有找到相同的结果查看十进制值,您的前两个字符串不同,因为第一个字符:(b=98)-(b=66)=32我的错,我添加了所有字母,但只有第一个被指出,这就是为什么我找不到相同的结果。。98-110=-12和98-66=32…只有当两个字符串相同时,
'\0'
的显式检查才适用(并返回
0
以指示这一点)。如果字符不相同,则函数会在字符不相等的第一个位置比较字符。如果一个字符串是另一个字符串的初始子字符串(
“abc”
“abcde”
或反之亦然),它会将一个字符串的终止
'\0'
与另一个字符串的相应非空字符进行比较。这与标准的
strcmp
函数并不完全相同。如果任一字符串包含负值字符,则该操作可能失败。只有当普通
char
被签名(通常是这样)时,才会发生这种情况。引用该标准:“比较函数
memcmp
strcmp
strncmp
返回的非零值的符号由在被比较对象中不同的第一对字符(均解释为
无符号字符
)的值之间的差值的符号确定。”有几个答案提到了ASCII。这是一个具有一种编码的字符集。字符集将字符映射到数字。编码将数字映射到字节。您可能没有使用ASCII(将来也不会)。Windows-1252(及类似版本)和Unicode/UTF-8更为常见。了解您使用的字符集和编码很重要。字符数将决定字典顺序。算法必须处理编码。词典排序是最简单的。通常,排序由排序规则指定,排序规则可以与区域设置或区域性相关联。
int ft_strcmp(char *s1,char *s2)
{
    int x;

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