【问题标题】:Filling an array row by row (one dimensional array)逐行填充数组(一维数组)
【发布时间】:2017-09-24 11:42:35
【问题描述】:

对于学校,我必须使用一个分成不同行的数组来构建“汽车导航”,如下所示:

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();
        }
    }
}

【问题讨论】:

  • 跳过换行符....
  • &lt;= (maxY-1) ==> &lt; maxY(编译器无论如何都会优化它,但尽量避免不必要的操作)'int maxX, int maxY ==> size_t maxX, size_t maxY
  • 你的 char 数组是如何实例化的?它是否以正确大小的 maxX * maxY 实例化?我可能会使用二维数组。迷宫[j][i] = getchar();
  • @RobbieChiha 我认为 OP 使用一维数组,模拟二维数组。因此,您的方法将行不通。

标签: c arrays loops io getchar


【解决方案1】:

当用户输入数据时,他键入一个数字、一个字符串,然后他按 Enter。

现在你的程序使用getchar(),它一次读取一个字符,或者把它写在参考文献中:

从标准输入 (stdin) 返回下一个字符。

因此,当用户键入“S#####”时,他按 Enter。现在getchar() 将消耗标准输入缓冲区(存储用户输入)中的所有内容。

它将消耗'S',然后是所有'#',因为您已经多次调用getchar()

现在用户输入下一个输入行“.....#”。您希望 getchar() 使用该输入。该函数被调用,并且在第一次调用时,它不会消耗'.'(在您的情况下这是所需的行为),它将消耗换行符(来自输入前一行时用户之前点击的输入)。

因此,它将跳过一些打算读取的字符。这正是您的情况发生的情况,因为您的程序正在消耗每个输入行中的所有换行符,并且当即将读取最后一行时,它已完成(因为您计划调用 getchar() maxX x @ 987654331@ 次。但是,您没有考虑换行符。

因此,只需在接收下一个输入行之前使用额外的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

【讨论】:

  • 我尝试了您的代码,但它似乎不起作用。但是,解决方案的线索确实是换行符。这似乎确实有效:void inputMaze(char maze[], int maxX, int maxY) { int i, j; char c; for (j = 0; j &lt; maxX; j++) { printf("Input row %d: ",j); for (i = 0; i &lt; maxY; i++) { scanf(" %c", c); if (c == '\n') continue; else maze[(j * maxY) + i] = getchar(); } } } 编辑:期望代码在评论中看起来更好,将其发布在顶部
猜你喜欢
  • 2015-10-23
  • 2019-01-18
  • 2015-01-24
  • 2020-08-02
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多