C语言字符串与字符数组
- #include "stdafx.h"
- #include "string.h"
- int main(int argc, char* argv[])
- {
- //char b[5] = {"hello"}; //编译时报错
- char b[6] = {"hello"};
- //或
- //char b = {"hello"}; //正确
- char a[5] = {'h', 'e', 'l', 'l', 'o'};
- printf("hello:%s\n", b);
- printf("b length is : %d\n", strlen(b));
- printf("a length is : %d\n", strlen(a));
- return 0;
- }
此时的输出如下
hello:hello
b length is :5
a length is :13
如果将代码
- char a[5] = {'h', 'e', 'l', 'l', 'o'};
修改为
- char a[6] = {'h', 'e', 'l', 'l', 'o', '\0'};
则输出为
hello:hello
b length is :5
b length is :5
问题:
1.为什么第一次的执行“printf("a length is : %d\n", strlen(a));”的输出结果是“13”?
2.对于'\0'是不是字符串会自动在后面加上而字符数组中则不会加上,那么字符数组中何时会出现'\0'字符?
回答
grhappygr 写道
楼上有几个错误,字符串数组有时不会填\0,当数组大小等于字符串大小的时候没有位置添加\0,也就是说b[n>5]="hello"的情况时才会添加\0,所以b[6]时strlen()正确,因为strlen以“\0"判断,这点要和sizeof区分 而出现11的情况,你要懂得a,b的内存分配,其实是a连接在了没有\0结尾的b上得结果,可以查看a,b的地址printf("%X %X",&a,&b)来判断;
- printf("a = %x, b = %x, a[1] = %x, a[2] = %x, a[3] = %x, a[4] = %x, a[5] = %x,a[4] = %x, a[5] = %x \n", a, b, &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7]);
- printf("a[5] = %d, a[6] = %d, a[7] = %d, b[5] = %d\n", a[5], a[6], a[7], b[5]);
输出结果如下:
- a = 12ff70, b = 12ff78, a[1] = 12ff71, a[2] = 12ff72, a[3] = 12ff73, a[4] = 12ff
- 74, a[5] = 12ff75,a[4] = 12ff76, a[5] = 12ff77
- a[5] = -52, a[6] = -52, a[7] = -52, b[5] = 0
字符'\0'对应的ASCII码值为0,ASCII值为0的字符对应的为空字符'NUL',不执行任何操作,对程序无影响。
原文转载iteye http://www.iteye.com/problems/73176