C字符数组打印数字而不是分配的章节

C character array printing numbers insted of the assigned charaters

我正在做一项作业,解决从二维字符数组创建的迷宫问题。为了测试程序,我制作了一个简单的 4x4 迷宫。但是当打印到屏幕上时,迷宫是由数字组成的。我很困惑这是怎么发生的。任何帮助将不胜感激。

作业是这样的:

char *maze[4][4];
for (int i=0; i < 4; ++i)
{
    maze[0][i] = "#";
    maze[3][i] = "#";
    maze[1][i] = ".";
}
maze[2][0] = "#";
maze[2][3] = "#";
maze[2][1] = ".";
maze[2][2] = ".";

打印在这里:

for(int i =0; i < 4; ++i)
{
    for(int j = 0; j < 4; ++j)
    {
        printf("%c",maze[i][j]);
    }
    printf("\n");
}

我希望它打印这个:

####
....
#..#
####

但它打印的是:

0000
2222
0220
0000
maze[0][i] = "#";

应该是

maze[0][i] = '#';

char *maze[4][4];应该是char maze[4][4];

"#"是一个字符串字面量,使用'#'有一个字符常量。

如果你真的想使用一个字符的字符串文字,你必须在你的原始程序中使用 %s 转换规范而不是 %c

问题出在这一行

printf("%c",maze[i][j]);

您使用的不是字符,而是字符指针(又名字符串),因此应该是这样的:

printf("%s",maze[i][j]);

或者您也可以按照其他答案中的描述使用字符。

printf 调用中存在类型不匹配。您正在打印 maze[i][j],这是一个 char *(字符串),作为一个字符 (%c)。我建议打开编译器警告来捕获这些类型的错误; gcc 在我尝试编译您的代码时发现了问题。

它打印数字而不是字符的原因是因为 printf 将字符串 maze[i][j] 的地址解释为 ASCII 代码点并打印相应的字符。对于您的编译器,"#""." 的地址恰好导致打印字符 02。我的情况不同;当我编译你的代码时,程序打印了 EOT 和 ACK。

最好的解决方案是将 maze 声明为 char 的数组而不是字符串。

char maze[4][4] = {
  { '#', '#', '#', '#' },
  { '.', '.', '.', '.' },
  { '#', '.', '.', '#' },
  { '#', '#', '#', '#' }
};