逐行填充数组(一维数组)

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