在C中读取2D字符数组时遇到问题?

时间:2011-09-27 12:44:19

标签: c

这是代码:

#include <stdio.h>
#include <stdlib.h>

void acceptMaze(char maze[ROW][COLOUMN], int nrows, int ncols)
{
    int i,j;
    for (i = 0; i < nrows; i++)
    {
        fprintf(stdout,"I = %d",i);
        for (j = 0; j < ncols; j++) 
        {
            fprintf(stdout,"J = %d",j);
            scanf("%c",&maze[i][j]);
        }
    }
}

在输入数据时,它显示i =0 j=0j=1。所以你看到j = 0不存在。我正在使用linux系统。任何人都可以解决这个问题。

3 个答案:

答案 0 :(得分:3)

您的问题源于%c转换说明符不会跳过空格的事实。如果来自先前输入操作的输入流中存在新行,则scanf调用将读取该行并将其分配给maze[i][j]

这是一个解决方法:

#include <ctype.h>
...
for (i = 0; i < nrows; i++)
{
  for (j = 0; i < nrows; j++)
  {
    int c;
    do c = getchar(); while (isspace(c));
    maze[i][j] = c;
  }
}

do c = getchar(); while (isspace(c))将读取输入字符,直到您遇到非空白字符。

修改

呃,我刚刚意识到这个计划有一个丑陋的缺陷;如果你希望为你的迷宫分配一个像空白一样的空格字符,这将无法正常工作。当然,您只需添加条件表达式:

do c = getchar(); while (isspace(c) && c != ' ');

答案 1 :(得分:0)

您需要输出一些换行符,以便用户更容易阅读。怎么样:

#include <stdio.h>
#include <stdlib.h>

void acceptMaze(char maze[][],int nrows,int ncols)
{

    int i,j;
    for(i=0;i<nrows;i++)
    {
        for(j=0;j<ncols;j++) 
        {
            printf("\nenter %d,%d: ",i, j);
            scanf("%c",&maze[i][j]);
        }
    }
}

答案 2 :(得分:0)

输入键被接受为半数查询的输入。假设您提示i = 0,j = 0,并且用户输入“5”,然后输入回车键。 Scanf将'5'插入迷宫[0] [0],并在循环的下一次迭代中,它看到回车键仍在缓冲区中,因此它将其插入迷宫[0] [1]。

每次scanf后都需要刷新输入。一种解决方案是#include <iostream>,并在每次扫描后调用std::cin.ignore()