逐行填充数组(一维数组)
Filling an array row by row (one dimensional array)
对于学校,我必须使用分成不同行的数组构建一个 "car navigation",如下所示:
S#####
.....#
#.####
#.####
...#.D
##...#
我们的想法是找到一条通向目的地的清晰路径(“.”字符)并将其替换为“+”字符。
我在填充数组时遇到问题。练习是:
编写一个函数 void inputMaze(char maze[], int maxX, int maxY)
要求用户
输入 maxY
个字符串,每个字符串包含 maxX
个字符。这些字符串应该存储在数组 maze
和字符串中
应由以下字符组成:
• ‘S’ - 起始位置。
• 'D' - 目的地。
• ‘.’ - 允许汽车行驶的位置。
• '#' - 禁止汽车行驶的位置(障碍物)。
程序的输出应如下所示:
Number of rows? 6
Number of columns? 6
Input row 0: S#####
Input row 1: .....#
Input row 2: #.####
Input row 3: #.####
Input row 4: ...#.D
Input row 5: ##...#
我试过这样写函数:
void inputMaze(char maze[], int maxX, int maxY)
{
int i, j;
for (j = 0; j <= (maxX-1); j++)
{
printf("Input row %d: ",j);
for (i = 0; i <= (maxY-1); i++)
{
maze[(j * maxY) + i] = getchar();
}
}
}
然而,当我执行该函数并到达 j == (maxX-1)
时,显示了打印行但它跳过了行 maxX - 1
的输入(完全忽略了 for 循环)并继续下一个步骤。
我的代码哪里出了问题?
编辑:答案是换行符。此代码似乎确实有效:
void inputMaze(char maze[], int maxX, int maxY)
{
int i, j;
char c;
for (j = 0; j < maxX; j++)
{
printf("Input row %d: ",j);
for (i = 0; i < maxY; i++)
{
scanf(" %c", c);
if (c == '\n')
continue;
else
maze[(j * maxY) + i] = getchar();
}
}
}
当用户输入数据时,他会键入一个数字、一个字符串等等,然后按 Enter。
现在你的程序使用 getchar()
,它一次读取一个字符,或者按照 ref:
中所写的那样
Returns the next character from the standard input (stdin).
因此,当用户键入 "S#####" 时,他按下 Enter。现在 getchar()
将使用标准输入缓冲区(存储用户的输入)中的所有内容。
它将消耗 'S'
,然后消耗所有 '#'
,因为您已调用 getchar()
多次。
现在用户输入下一个输入行“.....#”。您希望 getchar()
消耗该输入。该函数被调用,在第一次调用时,它不会使用 '.'
(这是您的情况下所需的行为),而是使用换行符(从 Enter 用户点击之前输入上一行时).
因此,它会跳过一些要阅读的字符。这正是您的情况,因为您的程序正在消耗每个输入行中的所有换行符,并且当最后一行即将被读取时,它已经完成(因为您计划调用 getchar()
maxX
x maxY
次。但是,您没有考虑换行符。
因此,在接收下一个输入行之前,只需使用一个额外的 getchar()
,以便使用尾随的换行符。或者,您可以检查当前读取的字符是否为换行符,并继续下一次迭代(消耗并忽略),如下所示:
void inputMaze(char maze[], int maxX, int maxY) {
int i, j; char c;
for (j = 0; j < maxX; j++) {
printf("Input row %d: ",j);
for (i = 0; i < maxY; i++) {
scanf(" %c", c);
if (c == '\n') continue;
else maze[(j * maxY) + i] = getchar();
}
}
}
提示:与你的问题无关,请注意,在双for循环中,我们通常将外循环的计数器命名为i
,将内循环的计数器命名为j
。
对于学校,我必须使用分成不同行的数组构建一个 "car navigation",如下所示:
S#####
.....#
#.####
#.####
...#.D
##...#
我们的想法是找到一条通向目的地的清晰路径(“.”字符)并将其替换为“+”字符。 我在填充数组时遇到问题。练习是:
编写一个函数 void inputMaze(char maze[], int maxX, int maxY)
要求用户
输入 maxY
个字符串,每个字符串包含 maxX
个字符。这些字符串应该存储在数组 maze
和字符串中
应由以下字符组成:
• ‘S’ - 起始位置。
• 'D' - 目的地。
• ‘.’ - 允许汽车行驶的位置。
• '#' - 禁止汽车行驶的位置(障碍物)。
程序的输出应如下所示:
Number of rows? 6
Number of columns? 6
Input row 0: S#####
Input row 1: .....#
Input row 2: #.####
Input row 3: #.####
Input row 4: ...#.D
Input row 5: ##...#
我试过这样写函数:
void inputMaze(char maze[], int maxX, int maxY)
{
int i, j;
for (j = 0; j <= (maxX-1); j++)
{
printf("Input row %d: ",j);
for (i = 0; i <= (maxY-1); i++)
{
maze[(j * maxY) + i] = getchar();
}
}
}
然而,当我执行该函数并到达 j == (maxX-1)
时,显示了打印行但它跳过了行 maxX - 1
的输入(完全忽略了 for 循环)并继续下一个步骤。
我的代码哪里出了问题?
编辑:答案是换行符。此代码似乎确实有效:
void inputMaze(char maze[], int maxX, int maxY)
{
int i, j;
char c;
for (j = 0; j < maxX; j++)
{
printf("Input row %d: ",j);
for (i = 0; i < maxY; i++)
{
scanf(" %c", c);
if (c == '\n')
continue;
else
maze[(j * maxY) + i] = getchar();
}
}
}
当用户输入数据时,他会键入一个数字、一个字符串等等,然后按 Enter。
现在你的程序使用 getchar()
,它一次读取一个字符,或者按照 ref:
Returns the next character from the standard input (stdin).
因此,当用户键入 "S#####" 时,他按下 Enter。现在 getchar()
将使用标准输入缓冲区(存储用户的输入)中的所有内容。
它将消耗 'S'
,然后消耗所有 '#'
,因为您已调用 getchar()
多次。
现在用户输入下一个输入行“.....#”。您希望 getchar()
消耗该输入。该函数被调用,在第一次调用时,它不会使用 '.'
(这是您的情况下所需的行为),而是使用换行符(从 Enter 用户点击之前输入上一行时).
因此,它会跳过一些要阅读的字符。这正是您的情况,因为您的程序正在消耗每个输入行中的所有换行符,并且当最后一行即将被读取时,它已经完成(因为您计划调用 getchar()
maxX
x maxY
次。但是,您没有考虑换行符。
因此,在接收下一个输入行之前,只需使用一个额外的 getchar()
,以便使用尾随的换行符。或者,您可以检查当前读取的字符是否为换行符,并继续下一次迭代(消耗并忽略),如下所示:
void inputMaze(char maze[], int maxX, int maxY) {
int i, j; char c;
for (j = 0; j < maxX; j++) {
printf("Input row %d: ",j);
for (i = 0; i < maxY; i++) {
scanf(" %c", c);
if (c == '\n') continue;
else maze[(j * maxY) + i] = getchar();
}
}
}
提示:与你的问题无关,请注意,在双for循环中,我们通常将外循环的计数器命名为i
,将内循环的计数器命名为j
。