2013-04-06 82 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循环的边界应该足以满足你的需求