问题:
如下C语言代码,通过两种方式赋值的字符串,结果arr1和arr2打印结果分别是什么?
#include <stdio.h>
int main()
{
char arr1[] = "abc";
printf("%s\n", arr1);
char arr2[] = { 'a','b','c' };
printf("%s\n", arr2);
return 0;
}
从字面表面看好像都是abc,正确结果如下所示
abc
abc烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫 烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫?恢??
原因
出现这样的结果的原因就是C语言中字符串默认是以’\0’结尾的,也就是打印字符串的时候的时候,会默认找到’\0’,上面arr2就是因为没有给赋值’\0’\,导致打印的时候就会一致往后找,一直周到’\0’,所以才会出现上述随机的乱码数据
若代码修改为如下:则两个字符串打印的结果就一致了
#include <stdio.h>
int main()
{
char arr1[] = "abc";
printf("%s\n", arr1);
char arr2[] = { 'a','b','c','\0' };
printf("%s\n", arr2);
return 0;
}
执行结果如下:
abc
abc
下面继续使用strlen()函数计算字符串的长度,观察arr1和arr2的长度
#include <stdio.h>
int main()
{
char arr1[] = "abc";
printf("%s\n", arr1);
printf("length of arr1:%d\n", strlen(arr1));
char arr2[] = { 'a','b','c'};
printf("%s\n", arr2);
printf("length of arr2:%d\n", strlen(arr2));
return 0;
}
执行结果如下,arr1的长度时3,而arr2的长度却是218,这里从另一个角度验证了C语言中字符串中以’\0’结尾,arr2字符串当数完3个字符时,发现还没有’\0’,所以这里继续往后找,同时需要注意的是这里arr2的长度并不是说一定是218,而应该是一个随机值
abc
length of arr1:3
abc烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫 烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫台政翎?
length of arr2:218
arr2末尾存放一个0也是可以的,这是因为’\0’的ASCII编码就是0,如下代码:
#include <stdio.h>
int main()
{
char arr1[] = "abc";
printf("%s\n", arr1);
char arr2[] = { 'a','b','c',0};
printf("%s\n", arr2);
return 0;
}
此时可以发现arr2同样也是abc
abc
abc