小小雷利

Satan's book

C语言字符串与字符数组

 

  1. #include "stdafx.h"  
  2. #include "string.h"   
  3.   
  4. int main(int argc, char* argv[])   
  5. {   
  6.     //char b[5] = {"hello"};  //编译时报错   
  7.     char b[6] = {"hello"};   
  8.     //或   
  9.     //char b = {"hello"}; //正确   
  10.     char a[5] = {'h''e''l''l''o'};   
  11.     printf("hello:%s\n", b);   
  12.     printf("b length is : %d\n", strlen(b));   
  13.     printf("a length is : %d\n", strlen(a));   
  14.     return 0;   
  15. }  

 

此时的输出如下

hello:hello

b length is :5

a length is :13

 

如果将代码

C代码 复制代码 收藏代码
  1. char a[5] = {'h''e''l''l''o'};  

 

 

修改为

C代码 复制代码 收藏代码
  1. 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)来判断;


 

 

C代码 复制代码 收藏代码
  1. 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]);   
  2. printf("a[5] = %d, a[6] = %d, a[7] = %d, b[5] = %d\n", a[5], a[6], a[7], b[5]);  

 

 

     输出结果如下:

C代码 复制代码 收藏代码
  1. a = 12ff70, b = 12ff78, a[1] = 12ff71, a[2] = 12ff72, a[3] = 12ff73, a[4] = 12ff   
  2. 74, a[5] = 12ff75,a[4] = 12ff76, a[5] = 12ff77   
  3. 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

 

 

posted on 2012-03-24 15:00  小小雷利  阅读(149)  评论(0编辑  收藏  举报

导航