2013-04-06 71 views
0
#include <stdio.h> 

int main(int argc, char **argv) { 

int x[5][5] = {{0,1,2,3,4},{5,6,7,8,9}}; 

for (int i = 0; i < 4; i++) { 
    for (int j = 0; i < 4; i++) { 
     printf("%d\n", x[i][j]); } } 

return 0; } 

這本來給我:0 1 2 3 4 5 6 7 8 9多維數組打印功能使不同的東西

,其結果是:0 5 0 0

然後,當我將其更改爲字符:

#include <stdio.h> 

int main(int argc, char **argv) { 

char x[5][5] = {{'0','1','2','3','4'},{'5','6','7','8','9'}}; 

for (int i = 0; i < 4; i++) { 
    for (int j = 0; i < 4; i++) { 
     printf("%d\n", x[i][j]); } } 

return 0; } 

我得到48 53 0 0

爲什麼?代碼對我來說很清楚,但似乎在背景上發生了一些晦澀的事情(或者我的大腦以非常「pythonic」的方式工作......)

+1

那麼,首先,你有兩組五個數字和三組五個零。我不知道這是你要做什麼。 – chris 2013-04-06 07:35:23

+0

在C'0'中,'1'...是具有數值48,49 ... – suspectus 2013-04-06 07:36:27

+0

@suspectus的字符,不一定。它可以根據正在使用的字符集而改變。 – chris 2013-04-06 07:37:37

回答

7

像@凱斯湯普森說,你沒有初始化所有25個元素。所以剩下的元素被初始化爲0。因此,數據將以這種方式存儲:

0 | 1 | 2 | 3 | 4  // Row 0 
    5 | 6 | 7 | 8 | 9  // Row 1 
    0 | 0 | 0 | 0 | 0  // Row 2 
    0 | 0 | 0 | 0 | 0  // Row 3 
    0 | 0 | 0 | 0 | 0  // Row 4 

您只初始化數組的前兩行。這就是爲什麼你得到0 5 0 0作爲你的輸出。

要獲得正確的輸出,您需要遍歷數組的前兩行。

步驟來解決這個問題:

首先

你需要改變你的第一個for循環來源:

for (int i = 0; i < 4; i++) 

for (int i = 0; i < 2; i++) 

原因:因爲你只想循環前兩行(第0行和第1行)

你需要你的第二個for循環的改變:

for (int j = 0; i < 4; i++) 

到:

for (int j = 0; j < 5; j++) 

原因:你需要爲你的循環條件變量j,不i。您還需要將4更改爲5;因爲在數組中,索引從0開始。因此,每列的索引分別爲0,1,2,3,4

綜上所述,你的代碼應該是...

for (int i = 0; i < 2; i++) 
{ 
    for (int j = 0; j < 5; j++) 
    { 
     printf("%d\n", x[i][j]); 
    } 
} 

此外,當你切換到char x[5][5],你需要使用%c,打印字符,而不是%d

而且,原因你越來越怪異號碼,如48因爲當您打印%d一個char,你實際上是它的打印值ASCII。參照下面的ASCII表格,編號48代表字符'0'

http://www.asciitable.com/ 圖片來自http://www.asciitable.com/

+1

是的,數組是5乘5,因爲他是這樣定義的。這裏只是沒有明確地初始化全部25個元素;剩餘的15個元素被隱式地初始化爲0. – 2013-04-06 07:40:54

+0

哦,是的。我會編輯答案。 – 2013-04-06 07:41:32

+0

只需簡單提一下,C不需要ASCII作爲字符集;相反,某些實現使用[EBCDIC](http://ferretronix.com/march/computer_cards/ebcdic_table.jpg)。 – Sebivor 2013-04-06 08:42:42

0
for(i = 0 ; i < 2 ; i++) 
for(j = 0 ; j < 5 ; j++) 
printf("%d\n",x[i][j]); 

我不知道爲什麼你只初始化2 1-d陣列。但改變for循環的邊界應該足以滿足你的需求