C 逐行填充数组(一维数组)
对于学校,我必须使用一个数组构建一个“汽车导航”,该数组被分成不同的行,如下所示:C 逐行填充数组(一维数组),c,arrays,loops,io,getchar,C,Arrays,Loops,Io,Getchar,对于学校,我必须使用一个数组构建一个“汽车导航”,该数组被分成不同的行,如下所示: S##### .....# #.#### #.#### ...#.D ##...# 其思想是找到一条到目的地的清晰路径(“.”字符),并将其替换为“+”字符。 我在填充数组时遇到问题。这项工作是: 编写一个函数,要求用户 输入maxY字符串,每个字符串包含maxX个字符。这些字符串应存储在数组maze和字符串中 应包含以下字符: •“S”-起始位置 •“D”-目的地 •“.”-允许汽车行驶的位置 •“#”-不允
S#####
.....#
#.####
#.####
...#.D
##...#
其思想是找到一条到目的地的清晰路径(“.”字符),并将其替换为“+”字符。
我在填充数组时遇到问题。这项工作是:
编写一个函数,要求用户
输入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();
}
}
}
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();
}
}
}
当用户输入数据时,他输入一个数字、一个字符串,然后点击回车键 现在,您的程序使用,它一次读取一个字符,或将其写入ref: 返回标准输入(stdin)中的下一个字符 因此,当用户键入“S######”时,他点击回车键。现在
getchar()
将使用标准输入缓冲区(存储用户输入)中的所有内容
它将消耗'S'
,然后是所有'#'
,因为您已经多次调用了getchar()
现在,用户输入下一个输入行“…#”。您希望getchar()
使用该输入。函数被调用,在第一次调用时,它将使用换行符(输入前一行时,从“输入用户”之前的点击中),而不是使用“”。
(在您的情况下,这是所需的行为)
因此,它将跳过一些要读取的字符。这正是您的情况,因为您的程序正在使用每个输入行中的所有换行符,并且当最后一行即将被读取时,它已经完成了(因为您计划调用getchar()
maxX
xmaxY
次。但是,您没有考虑换行符
因此,在接收下一个输入行之前,只需使用额外的getchar()
,即可使用尾随的换行符。或者,您可以检查当前读取的字符是否为换行符,然后继续下一次迭代(使用并忽略),如下所示:
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();
}
}
}
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();
}
}
}
void输入迷宫(字符迷宫[],int-maxX,int-maxY){
int i,j;char c;
对于(j=0;j
提示:与您的问题无关,请注意,在双for循环中,我们通常将外循环的计数器命名为
i
,将内循环的计数器命名为j
,跳过换行符….
(编译器将对其进行优化,但会尽量避免不必要的操作)“int-maxX,int-maxY
=>size\t-maxX,size\t-maxY
您的字符数组是如何实例化的?它的实例化大小是否正确?我可能会使用2d数组。maze[j][I]=getchar();@RobbieChiha我认为OP使用了一个1D数组,它模拟了一个2D数组。因此,你的方法不起作用。我尝试了你的代码,但它似乎不起作用。然而,解决方案的线索确实是换行符。这似乎起作用:void inputMaze(char maze[],int maxX,int maxY){int I,j;char c;for(j=0;j
Edit:希望代码在注释中看起来更好,将在顶部发布