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”的方式工作......)

4

2 回答 2

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. 您还需要从 更改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]); 
    } 
}

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

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

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

于 2013-04-06T07:36:54.910 回答
0
for(i = 0 ; i < 2 ; i++)
for(j = 0 ; j < 5 ; j++)
printf("%d\n",x[i][j]);

我不知道你为什么只初始化 2 个一维数组。但是更改 for 循环中的边界应该足以满足您的需求

于 2013-04-06T07:44:22.840 回答