#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
然后,当我将它们改为chars时:
#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”的方式工作......)
答案 0 :(得分:7)
就像@Keith Thompson所说,你没有初始化所有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
等奇怪数字的原因是因为当您使用char
打印%d
时,实际上您正在打印其ASCII值。参考下面的ASCII表,数字48
代表字符'0'
。
答案 1 :(得分:0)
for(i = 0 ; i < 2 ; i++)
for(j = 0 ; j < 5 ; j++)
printf("%d\n",x[i][j]);
我不知道你为什么只初始化了2个1-d阵列。但是更改for循环中的边界应该足以满足您的需求