C++题目:char s1[]="holl";char s2[]={'h','o','l','l'};cout<<strcmp(s1,s2);为什么?

高分请问一下,C++题目:char s1[]="holl";char s2[]={'h','o','l','l'};cout<
最新回答
薄荷绿℡

2024-11-03 02:51:25

这是因为s1[]="holl";系统会在字符串后面赋给一个'\0';
而s2[]={'h','o','l','l'};只是字符数组而已元素4个,后面没'\0'
请看strcmp原型:
strcmp(
char*
s1,char*
s2)
{
for(;*s1==*s2
&&
*s1!=0;++s1,++s2);\\当s1=='\0'时跳出循环。
return
*s1-*s2;
\\而*s2是已经自加后的也就是'l'后面地址的一个值,
可能是1(不可预料的值);*s1为0所以strcmp()=-1(可能为-1);
}
温柔姐无与伦比

2024-11-03 02:47:07

先说strcmp
原型:extern
int
strcmp(char
*s1,char
*
s2);
用法:#include
<string.h>
功能:比较字符串s1和s2。
说明:
当s1<s2时,返回值<0
当s1=s2时,返回值=0
当s1>s2时,返回值>0
即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。如:
"A"<"B"
"a">"A"
"computer">"compare"
s1有五个元素
holl
和结束符\0
s2有四个元素
holl
char
s1[]="holl";申请栈内存,是一个连续地址,s1有结尾符
然后char
s2[]={'h','o','l','l'};在s1后申请一个栈内存也是一个连续地址,但是s2没有结尾符,s1和s2地址是连续的,s2后是s1。当strcmp(s1,s2);时候,实际比较的是
'h','o','l','l','\0'和'h','o','l','l','h','o','l','l','\0'
s1<s2
所以返回
-1
山川志

2024-11-03 01:41:29

这个问题很多,首先strcmp必须要你保证s1能容下两个字符串以及一个结尾符号,而且s2定义是个字符数组,不能用字符串操作函数,要用必须给s2加上结尾符