如例:
char a[]="I am happy";
等价于char a[10]="I am happy";
问:数组a的长度是10,还是11?
回答:数组a的长度是11,
char c[6]=”abcde“; //定义一个长度为5的字符串,加上'\0' 正好是6个字符”;
系统会自动在字符串尾部加上一个\0结束符,字符串尾部有个'\0',如果没有这个结束标记,说明这个字符数组存储的并不是字符串。
1 char a[3] = {'m', 'j', '\0'}; // 添加了结束符\0
2
3 char b[] = {'i', 's'}; // 假设忘记添加结束符\0
4
5 printf("字符串a:%s", a); // 输出字符串a
6
7 printf("\n"); // 换行
8
9 printf("字符串b:%s", b); // 输出字符串b
复制代码
看清楚了,第3行的字符数组b后面没有添加结束符\0,因此b不算是个正宗的字符串。
按照你的猜想,字符串b的输出应该就是"is",但是输出结果为:,可以看出,当我们尝试输出b的时候,把a也输出了。
printf("字符串b:%s", b); // 输出字符串b
%s表示期望输出一个字符串,因此printf函数会从b的首地址开始按顺序输出字符,一直到\0字符为止,因为\0是字符串的结束标记。
所以,如果想要创建一个字符串,记得加上结束符\0,不然后果很严重,会访问到一些垃圾数据。
字符数组
字符数组的初始化与数值型数组初始化没有本质区别。但它除了可以逐个给数组元素赋予字符外,也可以直接用字符串对其初始化。
cahr c[]={1,2,3,4,5};//数值型
char c[5]={'i','l','o','v','e'};//字符型
size=sizeof(c);
printf("%d",size); |