簡體   English   中英

在C中打印String Arrays的元素時出現奇怪的行為

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM