2.3 用字符串定义字符数组的好处
使用字符串定义字符数组需要额外考虑其末尾的“\0”,为什么还要使用这种看上去“麻烦”的方法呢?从图5所示的代码就能看出原因。
图5 用字符串定义字符数组好处的代码
从图5中可以看出,a4是用字符串进行初始化的字符数组,a7是直接初始化的字符数组。第10-11行代码分别打印a4和a7,代码运行效果如图6所示。
图6 代码运行效果
从图6中可以看出,使用字符串进行初始化的字符数组a4,能打印出正确值;而直接初始化的字符数组a7,打印出来许多乱码。其原因就在于a4包含了“\0”,cout执行到“\0”时,就会停止打印;而a7中不包含“\0”,cout会一直打印下去,直到遇到“\0”才停止,如图7和图8所示。
图7 数组a4在内存中的值
图8 数组a7在内存中的值
从图7中可以看到,a4包含0x00,也就是“\0”,图8中红框是数组a7的内容,但是其不包含0x00,此时cout会继续打印绿框中的内容,也就是图6中的乱码,直到打印到紫框中的0x00,cout才停止输出。
3 字符数组的长度
当字符数组用字符串初始化时,可以通过strlen()函数获取字符数组长度。
3.1 通过strlen()函数获取字符数组长度
通过strlen()函数获取字符数组长度时,是不算字符数组最后一个元素“\0”的,代码如图9所示。
图9 通过strlen()函数获取字符数组长度的代码
此时,程序的输出是5而不是6。
3.2 通过sizeof()获取字符数组长度
在《GESP编程等级认证C++三级4-数组4》中提到,可以通过sizeof()获取数组中元素的个数,那么通过sizeof()获取字符数组长度的代码如图10所示。
图10 通过sizeof()获取字符数组长度的代码
此时程序的输出是6,也就是说,包含了数组末尾的“\0”。
4 真题解析
4.1 2024年12月选择题
本题正确答案是“A”(官方参考答案是“D”)。strlen()获取字符数组长度时,是不包含最后“0x00”的,需要注意的是,数组长度是要算上中间空格的。
4.2 2024年6月选择题
本题答案是“C”。使用字符串初始化字符数组时,数组的最后一个元素隐式地设置为0x00,因此str的长度是显式4加上隐式1,为5。
4.3 2024年6月判断题
本题答案是“错误”。字符常量’\0’确实是表示字符串的结束,其值为0x00;而字符常量’0’的值是0x30,因此两个常量不同。