這個問題在這里已經有了答案: 字符陣列應該如何用作字串? (4 個回答) 19 小時前關閉。
char x[3][3][3]={{"bad","had","rad"},{"bat","cat","hat"},{"hit","git","bit"}};
printf("%s\n", x[1][0]);
為什么此代碼的輸出是“batcathathitgitbit”而不僅僅是“bat”?我很難理解為什么它不只是列印一件物品。
uj5u.com熱心網友回復:
字串在 C 中必須有一個空終止符,它告訴編譯器在哪里停止決議字串。將每個字串設定更長的時間,以便末尾仍然有一個空字符
char x[3][3][4]={{"bad","had","rad"},{"bat","cat","hat"},{"hit","git","bit"}};
printf("%s\n", x[1][0]);
uj5u.com熱心網友回復:
你為什么得到這個輸出?
好吧,想想你的 printf 所采用的型別。你告訴它你將傳遞一個%s帶有const char*引數的,即以空字符結尾的字串。
現在想想你的 3 維陣列。它是如何在記憶體中實際布局的?作為連續單元格的字符:
x[0][0][0]- 那是'b',x[0][0][0]- 那是'a',x[0][0][2]- 那是'd',... 下一步是什么?不是
x[0][0][3],因為 x 最里面的維度是 3,而不是 4!所以我們沒有地方放尾隨'\0'。事實上,我們現在有:x[0][1][0]- 那是'h',x[0][1][1]- 那是'a',等等。
因此,只使用每個字串的前 3 個字符,并且您會得到一個不間斷的字符序列;字串甚至不以x.
你怎么能解決這個問題?
使最里面的維度足夠大以適合您的所有單詞:char x[3][3][4]. 然后你會得到預期的輸出(GodBolt)。
uj5u.com熱心網友回復:
簡單的測驗程式揭示了 3d 陣列的記憶體表示:
int main(void)
{
char x[3][3][3]={{"bad","had","rad"},{"bat","cat","hat"},{"hit","git","bit"}};
char *ptr = (char *)x;
for(size_t i = 0; i < sizeof(x); i )
{
printf("x[%2zu] = '%c'\n", i, ptr[i]);
}
}
x[ 0] = 'b'
x[ 1] = 'a'
x[ 2] = 'd'
x[ 3] = 'h'
x[ 4] = 'a'
x[ 5] = 'd'
x[ 6] = 'r'
x[ 7] = 'a'
x[ 8] = 'd'
x[ 9] = 'b'
x[10] = 'a'
x[11] = 't'
x[12] = 'c'
x[13] = 'a'
x[14] = 't'
x[15] = 'h'
x[16] = 'a'
x[17] = 't'
x[18] = 'h'
x[19] = 'i'
x[20] = 't'
x[21] = 'g'
x[22] = 'i'
x[23] = 't'
x[24] = 'b'
x[25] = 'i'
x[26] = 't'
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/356336.html
