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,因此兩個常量不同。