多维数组打印功能使不同的东西
#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”的方式工作......)
像@凯斯汤普森说,你没有初始化所有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'
。
是的,数组是5乘5,因为他是这样定义的。这里只是没有明确地初始化全部25个元素;剩余的15个元素被隐式地初始化为0. – 2013-04-06 07:40:54
哦,是的。我会编辑答案。 – 2013-04-06 07:41:32
只需简单提一下,C不需要ASCII作为字符集;相反,某些实现使用[EBCDIC](http://ferretronix.com/march/computer_cards/ebcdic_table.jpg)。 – Sebivor 2013-04-06 08:42:42
for(i = 0 ; i < 2 ; i++)
for(j = 0 ; j < 5 ; j++)
printf("%d\n",x[i][j]);
我不知道为什么你只初始化2 1-d阵列。但改变for循环的边界应该足以满足你的需求
那么,首先,你有两组五个数字和三组五个零。我不知道这是你要做什么。 – chris 2013-04-06 07:35:23
在C'0'中,'1'...是具有数值48,49 ... – suspectus 2013-04-06 07:36:27
@suspectus的字符,不一定。它可以根据正在使用的字符集而改变。 – chris 2013-04-06 07:37:37