问:C++中定义字符型数组时'\0'是不是也占一位?是不是定义char a[5],只能有4个字符?那计算字符长度时又否忽略'\0'?
答:
C++中定义字符型数组时'\0'是不是也占一位?是不是定义char a[5],只能有4个字符,(是的,如果你把这个字符数组看成一个字符串的话,这里应该是最多4个字符,)
那计算字符长度时又否忽略'\0'? (是的)
解释:
定义char a[5],则说明,a是个字符数组,在内存中占五个字节空间如果用a来存储字符串,则最多只能有4个有效字符,必须给\0留个空间。计算a的长度与a的大小是不同的概念a按字符串来算长度是从a这个地址开始,计数到\0字符,这之间的字符个数是字符串a的长度。一般常用strlen()函数来获取字符串长度。计算a的大小用sizeof命令,sizeof(a)得到的是a在内存中占的字节数!字符串与字符数组不要混为一谈。它们相同在形式上,区别就在,字符串一定有\0结束符,而数组不需要!什么是字符串?就是以双引号引起来的数据才叫字符串。字符数组可以存储字符串!
示例:
1 char szbufA[5]="ABCD";
2 //szbufA表达式的值:0x0035f9bc "ABCD"
3
4 //szbufC[5]="ABCD1"; //编译报错 error C2440: “=”: 无法从“const char [6]”转换为“char”
5
6 char szbufB[5];
7 szbufB[0]='a';
8 szbufB[1]='b';
9 szbufB[2]='c';
10 szbufB[3]='d';
11 szbufB[4]='e';
12 //szbufB表达式的值:0x0035f9ac "abcde烫烫烫烫烫藺BCD"
13
14 int na = sizeof(szbufA);//na=5
15 int naa = strlen(szbufA);//naa=4
16 int nb = sizeof(szbufB);//nb=5
17 int nbb = strlen(szbufB);//nbb=20
从以上代码的1-12行代码中可以看出,定义字符数组时,使用字符串初始化只能使用长度为数组大小(n-1)的字符串。使用大于等于字符数组长度的字符串初始化会报错。
从以上代码第2、12和17的代码中可以看出,使用五个字符分别给szbufB字符数组赋值,导致szbufB数组没有'\0'结束符,szbufB数组的表达式值是错误的,szbufB的长度不是5,而是20了。
把szbufB字符数组拷贝到其他字符数组或者字符串地址时,拷贝的内容可能会出错。因为szbufB数组没有'\0'结束符。
总结:定义字符数组保存字符串时,字符数组大小= 字符串长度 + 1。sizeof数组名,是计算数组占用字节的大小。strlen数组名,是计算数组中字符串的长度(不包括'\0'结束符)。
原文链接: https://www.cnblogs.com/lisuyun/p/6393198.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/249280
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!