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 代码点并打印相应的字符。对于您的编译器,"#"
和 "."
的地址恰好导致打印字符 0
和 2
。我的情况不同;当我编译你的代码时,程序打印了 EOT 和 ACK。
最好的解决方案是将 maze
声明为 char
的数组而不是字符串。
char maze[4][4] = {
{ '#', '#', '#', '#' },
{ '.', '.', '.', '.' },
{ '#', '.', '.', '#' },
{ '#', '#', '#', '#' }
};
我正在做一项作业,解决从二维字符数组创建的迷宫问题。为了测试程序,我制作了一个简单的 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 代码点并打印相应的字符。对于您的编译器,"#"
和 "."
的地址恰好导致打印字符 0
和 2
。我的情况不同;当我编译你的代码时,程序打印了 EOT 和 ACK。
最好的解决方案是将 maze
声明为 char
的数组而不是字符串。
char maze[4][4] = {
{ '#', '#', '#', '#' },
{ '.', '.', '.', '.' },
{ '#', '.', '.', '#' },
{ '#', '#', '#', '#' }
};