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

时间:2017-09-24 11:42:35

标签: c arrays loops io getchar

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

S#####
.....#
#.####
#.####
...#.D
##...#

我们的想法是找到目的地的清晰路径('。'字符),并用'+'字符替换它们。 我在填充数组时遇到问题。练习是:

编写一个要求用户的函数void inputMaze(char maze[], int maxX, int maxY) 每个输入maxYmaxX个字符串。这些字符串应存储在数组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();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

当用户输入数据时,他键入一个数字,一个字符串,无论如何,然后他点击Enter。

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

  

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

因此,当用户键入“S #####”时,他会按Enter键。现在listenForSpeech(): void { this.isSpeechSupported(); this.getPermission(); this.hasPermission(); this.getSupportedLanguages(); this.iosOptions = { language: 'en-US' } if (this.platform.is('android')) { this.speech.startListening().subscribe(data => this.ivr(data), error => console.log(error)); } else if (this.platform.is('ios')) { this.speech.startListening().subscribe(data => this.speechList = data[0], error => console.log(error)); } } 将使用标准输入缓冲区(存储用户输入)中的所有内容。

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

现在用户输入下一个输入行“.....#”。您希望getchar()使用该输入。调用该函数,并在第一次调用时,不使用getchar()(这是您所希望的行为),它将使用换行符(来自输入用户命中之前,当输入前一行时) )。

结果,它将跳过一些打算读取的字符。这正是你的情况所发生的事情,因为你的程序消耗了每个输入行的所有换行符,并且当最后一行即将被读取时,它已经完成(因为你计划调用'.' {{1 }} x getchar()次。但是,您没有考虑换行符。

因此,在接收下一个Input行之前,只需使用额外的maxX,以便使用该尾随换行符。或者,您可以检查当前读取的字符是否为换行符,并继续下一次迭代(使用和忽略),如下所示:

maxY

提示:与您的问题无关,请注意,在for for循环中,我们通常将外循环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(); } } } 的计数器命名。