对于学校,我必须使用分成不同行的数组来构建“汽车导航”,如下所示:
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();
}
}
}
答案 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();
}
}
}
的计数器命名。