我正在学习在C中使用多维数组,我无法理解为什么printf()
有时会在下面的程序中给出意想不到的结果。
这个程序的想法是,我希望初始化一个5x2数组,并接受来自用户的5个整数,用scanf
填充第二个索引,然后打印数组:
#include <stdio.h>
#include <conio.h>
int main(void)
{
int i=0, mat[5][2] = {
{0, 0},
{0, 0},
{0, 0},
{0, 0},
{0, 0}
};
printf("Please enter 5 integers then press enter: n");
do {
scanf("%i", &mat[i][2]);
i++;
} while (getchar() != 'n');
printf("Here's what the 5x2 array looks like: n");
for(i = 0; i < 5; i++){
printf("%i %i", mat[i][1], mat[i][2]);
printf(" n");
}
return 0;
}
如果我作为用户输入某些整数,则输出如预期:
C:Usershackr>tmp.exe
Please enter 5 integers then press enter:
0 1 2 3 4
Here's what the 5x2 array looks like:
0 0
0 1
0 2
0 3
0 4
但是,如果我输入不同的整数,那么最后一行的输出就不是我所期望的:
C:Usershackr>tmp.exe
Please enter 5 integers then press enter:
1 2 3 4 5
Here's what the 5x2 array looks like:
0 1
0 2
0 3
0 4
0 4
C:Usershackr>tmp.exe
Please enter 5 integers then press enter:
9 8 7 6 5
Here's what the 5x2 array looks like:
0 9
0 8
0 7
0 6
0 4
实际上,正如你在上面看到的,看起来索引2的最后一个元素是任意的"4"。
也许这是由于我对数组值如何索引或引用的误解?
数组总是从索引0开始
您可以尝试下面的代码片段:
#include <stdio.h>
#include <conio.h>
int main(void)
{
int i=0, mat[5][2] = {
{0, 0},
{0, 0},
{0, 0},
{0, 0},
{0, 0}
};
printf("Please enter 5 integers then press enter: n");
do {
scanf("%i", &mat[i][1]);
i++;
} while (getchar() != 'n');
printf("Here's what the 5x2 array looks like: n");
for(i = 0; i < 5; i++){
printf("%i %i", mat[i][0], mat[i][1]);
printf(" n");
}
return 0;
}
while声明你可以使用mat[5][2],但是访问你应该使用
mat[0][0] mat[0][1]
mat[1][0] mat[1][1]
...
..
mat[4][0] mat[4][1]
我想现在应该可以了
mat
定义为:
int mat[5][2];
当您试图访问
中超出边界的元素时,x
在0 ~ 4范围内和y
在0 ~ 1范围内的有效元素是mat[x][y]
scanf("%i", &mat[i][2]);
和
printf("%i %i", mat[i][1], mat[i][2]);