[英]Strange behaviour when printing elements of String Arrays in C
我知道這是一個非常簡單的代碼,但是當打印數組的元素時,第四個元素被打印兩次,如下圖所示。
void printWeekDays(){
char days[7][9] = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
for(int i=0; i < 7; i++){
printf("%s \n",days[i]);
}
星期一
星期二
星期三星期四
星期四
星期五
星期六
星期日
這是我的環境:Apple LLVM 10.0.0版(clang-1000.11.45.5)
目標:x86_64-apple-darwin17.7.0
"Wednesday"
需要char[10]
來保存\\0
char。
你得到奇怪的行為因為printf
將在輸入字符串中搜索\\0
以停止打印,但你的"wednesday"
沒有附加\\0
字符。
因此, printf
繼續打印,直到它在"thursday"
打印后得到\\0
。
改變這個
char days[7][9]
至
char days[7][10]
要么
const char *days[7] //Compiler automatically adjust the size needed to store string literals.
這是因為"Wednesday"
不適合9個字符的數組。 當然,星期三只有9個字母,但是每個字符串末尾的空終止符都是10個字符。 發生的事情是null terinator從"Thursday"
到達T
地方,當"Thursday"
被寫入其相應的位置時,該null終止符被覆蓋。 因此,當你試圖在星期三打印時,為什么兩個都會在彼此之后打印。 它不會在星期三結束時停止,因為下一個空終止符是在星期四結束。
要修復它,請更改:
char days[7][9] = {
對此:
char days[7][10] = {
如果您不知道null終結符的工作原理並希望了解更多信息,可以在此處閱讀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.