strcmp()在C中完全返回什么?

我在C中写了这段代码:

#include  #include  #include  #include  int main() { char string1[20]; char string2[20]; strcpy(string1, "Heloooo"); strcpy(string2, "Helloo"); printf("%d", strcmp(string1, string2)); return(0); } 

控制台打印值是1还是o值和\0字符的ASCII值之间的差值,即111? 在这个网站上写道,这应该给出111,但当我在我的笔记本电脑上运行时,它显示1.为什么?

来自cppreference.com文档

 int strcmp( const char *lhs, const char *rhs ); 

返回值

  • 如果lhs在字典顺序中出现在rhs之前,则为负值。

  • 如果lhs和rhs相等则为零。

  • 如果在按字典顺序排列的rhs之后出现lhs,则为正值。

正如你所看到的那样,它只是表示消极,零或正面。 你不能指望任何其他东西。

您链接的网站不正确。 它告诉您返回值为< 0== 0> 0并且它给出了一个示例并显示了它的输出。 它不告诉输出应该是 111

引用手册页:

如果找到s1(或其前n个字节),则strcmp()和strncmp()函数返回小于,等于或大于零的整数,小于,匹配或大于s2 。

换句话说,你永远不应该依赖strcmp的确切返回值(当然不是0 )。 唯一的保证是,如果第一个字符串为“较小”,则返回值为负,如果第一个字符串为“较大”,则为正数,如果相等,则为0 。 相同的输入可能在strcmp不同实现的不同平台上生成不同的结果。

如果string1按字母顺序小于string2,则strcmp返回‘小于0的值’ ; zero ,如果他们是平等的; 如果字符串1按字母顺序大于字符串2,则为“大于0”的值

输出取决于实现。 strcmp函数的一个不错的实现是:

 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; } 

如果s1 s2,则返回1,如果s1 = s2,则返回0。
但通常,有一个更快的版本实现实际使用:

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

请注意,这更快,因为它会跳过之前完成的分支。 因此,我们通常有这样的惯例:负返回值意味着s1在字典上小于s2 ,而正值意味着反之亦然。

 int strcmp(const char *str1, const char *str2) 

将返回一个小于,等于或大于0的值。如果它返回0表示两个字符串相等,如果它返回一个小于0的值,则表示str1小于str2。 如果它返回值> 0,则表示str2小于str1。

您的返回值为1,因为“Heloooo”比“Helloo”多一个字符。 事实上,Helloo这个词有6个字符,而Heloooo有7个字符。 恰好还有一个字符。

基本上, strcmp()可以返回以下内容:

  • 如果第二个字符串小于第一个第一个字符串,则> 0

    char s1, s2; strcpy (s1, "helloworld"); strcpy (s2, "world"); int check = strcmp (s1, s2);

  • 如果传递的字符串相同则为0

    char s1, s2; strcpy (s1, "hello"); strcpy (s2, "hello"); int check = strcmp (s1, s2);

    在这种情况下,当字符串相等时,check将为0

  • 如果第一个字符串小于第二个字符串,则< 0

    char s1, s2; strcpy (s1, "hello"); strcpy (s2, "worldhello"); int check = strcmp (s1, s2);

所以在你的情况下, strcmp ()将返回1因为字符串不相等。

看看这个和本教程有关strcmp ()