2013-03-31 29 views
0

示例代碼字符:嘗試打印存儲在一個2維數組

char map [20][20]; 
map [0] [0]=1; 
printf ("%s\n", map[0][0]); 

在編譯過程中,我得到這樣的警告:

warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’

雖然如果我寫printf ("%s\n", &map[0][0]);它在某種程度上正常工作。

這是爲什麼?

編輯:

對不起我的壞傑夫。如果我試試這個

map [0][0]='X'; 
printf ("%s\n", map[0][0]); 

我仍然得到同樣的警告。

+0

這將是有益的如果你用你正在使用的語言標記你的問題。 –

+0

你正在試圖打印什麼?你的兩個格式字符串都表明你正在嘗試打印一個*字符串*,但是你的問題和可變參數被推入到'printf()'調用中,這表明你正在嘗試打印一個*單字符*。那麼你想要什麼?一個字符串(即map [0])或一個char(即map [0] [0])? – WhozCraig

回答

1

在您發佈的代碼中,您試圖格式化字符串%s,結果printf方法需要傳遞一個char *。如果你傳遞一個int或一個char,它會發出一個警告。

打印單個字符,按您的例子中,你將需要:

printf("%c\n", map[0][0]); 

當你在&map[0][0]通過它的工作原理,就是因爲你現在傳遞一個指向字符(char*)的與傳遞給它一個字符數組相同。

請參閱printf reference

+0

謝謝你,真的很有幫助。 – Hobowpen

0

由於char本身就是一個數字值,一個8位的整數,所以這樣的代碼會讓你發出警告。至於你的第二個問題,使用「地址」操作符來獲取map [0] [0]的地址會得到一個指向map [0]的第一個元素的指針,或者在這種情況下爲值1,並且printf需要一個指向char數組的指針。 可以這樣考慮:

char map [20]; 
map [0]=1; 
printf ("%s\n", map); //or printf ("%s\n", &map[0]) 

都指向第一個元素,從而有效地進行打印,直至空,「\ 0」陣列中達到。

編輯:關於你的編輯,你仍然在訪問第一個元素,它是char類型的數字。 'X'可以讓你獲得該角色的數字等值。

0

它的作品,因爲你發出的第一個元素(字符*)鍵入..參數獲取其想要一個字符指針指向一個字符數組,你的情況printf函數裏面腐爛的地址