多维阵列打印带来了不同的东西

Eri*_*ans 0 c multidimensional-array

#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; }
Run Code Online (Sandbox Code Playgroud)

这本来应该给我: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; }
Run Code Online (Sandbox Code Playgroud)

我得到48 53 0 0.

为什么?代码对我来说非常清楚,但似乎在背景上发生了一些模糊的东西(或者我的大脑以非常"pythonic"的方式工作......)

Tha*_*vas 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
Run Code Online (Sandbox Code Playgroud)

您只初始化了数组的前两行.这就是你得到0 5 0 0输出的原因.

要获得正确的输出,您需要遍历数组的前两行.

解决此问题的步骤:

第一

你需要改变你的第一个for循环:

for (int i = 0; i < 4; i++)
Run Code Online (Sandbox Code Playgroud)

for (int i = 0; i < 2; i++)
Run Code Online (Sandbox Code Playgroud)

原因:因为您只想循环前两行(第0行和第1行).

第二

您需要更改第二个for循环:

for (int j = 0; i < 4; i++)
Run Code Online (Sandbox Code Playgroud)

至:

for (int j = 0; j < 5; j++)
Run Code Online (Sandbox Code Playgroud)

原因:您j的循环条件需要变量,而不是i.你还需要改变45; 因为在数组中,索引从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]); 
    } 
}
Run Code Online (Sandbox Code Playgroud)

此外,当您要更改时char x[5][5],您需要使用%c,来打印字符,而不是%d.

此外,你得到奇怪数字的原因是48因为当你打印一个charwith时%d,你实际上是打印它的ASCII值.参考下面的ASCII表,数字48代表字符'0'.

http://www.asciitable.com/ 来自http://www.asciitable.com/的图片