c++字符数组

简单定义:

char a1[3] = {'c', '+', '+'};    //定义一个含有3个字符的字符数组
char a2[4] = {'c', '+', '+', '\0'};  //定义一个含有4个字符的字符数组

第二条语句与下面的数组是相等的:

char a3[4] = "c++";
或
char a3[] = "c++";

因为使用字符串字面值给字符数组赋值,系统会手贱在末尾补上空字符——'\0';使用字符赋值则妥妥的不会,所以a1字符数组初始化后里面没有'\0'。

在获取一个字符数组的大小时,可以说有2种方式:
(1)使用sizeof(array)/sizeof(array[0]) 计算数组长度。
(2)使用C标准库函数strlen(),c++将其定义在cstring.h头文件中。
第一种是最靠谱的方法,可以用在任何数组上面,尝试输出a1, a2, a3的长度:

cout << sizeof(a2)/sizeof(a1[0]) << endl;
cout << sizeof(a2)/sizeof(a2[0]) << endl;
cout << sizeof(a3)/sizeof(a3[0]) << endl;

输出:

3
4
4

第二种方式使用情况比较有限,像a2以空字符'\0'结尾的,且数组中间没有空字符元素;以及像a3这种,用字符串字面值初始化的数组才有用:

cout << strlen(a3) << endl;

输出:

3

为什么跟上面不一致?因为strlen方法不会将末尾的空字符'\0'计算在内。相反,它遇到'\0'就会停止计算。不信我们可以试一下a1, a2调用以下strlen看看有什么结果:

cout << strlen(a1) <<endl; 
cout << strlen(a2) <<endl; 

输出:

9
3

因为a1数组内没有'\0'元素,所以strlen方法会读出数组的范围,直至遇到一个'\0'字符。因此返回的是一个不可预知的数字,笔者的机器上运行时9,在别的机器上很可能就不是了。
a2有4个元素,因为最后一个元素是'\0',所以没有计算在内。即使将a2改成这样,strlen(a2)的输出结果也会是3。

char a2[7] = {'c', '+', '+', '\0', 'p', 'r', 'i'};

所以,如果要获得a3这种字符数组的长度,还需要在调用strlen()方法后再加1,才返回正确的数组长度:

char a3[] = "c++";
cout << strlen(a3)  + 1 << endl;

输出:

4

真是这样吗,如果我给a3的字符串字面值里面加\0呢?

char a3[] = "c++\0";
cout << strlen(a3) + 1 << endl;

输出:

6

把\0放入双引号中意味着它被当做是字符串,而非单个字符。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • scanf scanf每次读入一个字符串,遇到空格,回车或者tab为止,下次继续读未读完的数据,相比而言,getc...
    墨白或者黑阅读 5,733评论 0 1
  • 数组在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称...
    朱森阅读 9,560评论 2 13
  • 在 C 语言中,有两种表示字符串的方法 字符串数组 char str[6]="123456"; 字符串常量 ...
    kayorl阅读 5,189评论 1 1
  • NBA例行赛: 公牛 vs 篮网 比赛时间: 2016.11.01 早上07:30 公牛 例行赛分析 公牛开季至今...
    NBA推荐分析阅读 3,180评论 0 0
  • 不会画画。写字也不好看。读了好多年英语,结果也不会说几句很棒的话,书也是看了很多,结果都放在灵魂里了。 于是,写文...
    苏溪阅读 1,651评论 0 0