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
但通常,有一个更快的版本实现实际使用:
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 ()
。