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
x
maxY
次。但是,您没有考虑换行符

因此,在接收下一个输入行之前,只需使用额外的
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:希望代码在注释中看起来更好,将在顶部发布