4

我有如下代码,它扫描一个矩阵,w - 矩阵的宽度,h - 矩阵的高度。

我正在使用 Visual Studio 2010。

每次我得到一个字符时,它都会将 j 增加 2(我设置了断点并开始了解这种行为)。

int w = 0, h = 0;
char map[21][21];
int i,j;

scanf("%d%d", &w, &h);
for(i = 1; i <= h; ++i){
    for(j = 1; j <= w; ++j){
        //fflush(stdin);
        scanf("%c",&map[i][j]);
        //fflush(stdin);
    }
}

这背后的原因是什么?

在扫描时,我给出了值,w = 7,h = 5。

我在我的代码中没有看到任何错误......请帮助我。

4

3 回答 3

5

问题是由于'\n'字符(按下时 Enter )由scanf.
吃掉这些换行符的一种方法是将 a ' 'before %cin scanf;

 scanf(" %c",&map[i][j]);  
        ^
        |
      space

另一种方法是使用循环来吃掉所有\ngetchar()

  int ch;
  while((ch=getchar())!='\n' && ch != EOF );
于 2013-10-12T19:10:11.900 回答
2

您需要从上一个跳过尾随换行符scanf

不要使用fflush(stdin)

利用:

int c;

while((c=getchar())!='\n' && c != EOF ); //eats newline came from scanf

scanf通话后

于 2013-10-12T17:53:33.590 回答
0

这是vuppala srikar的答案。他的问题“ fscanf issue while reading input from text file [duplicate] ”在我看来并不完全重复:

在他的问题中,scanf是在打开的文本文件 ( fptr) 上完成的。

代替 :

while((fscanf(fptr,"%c %d",&c,&val))==2)
{
    printf("%c %d\n",c,val);
}

它只读取文件的第一行,我建议:

char line [50] ;
while (fgets( line,sizeof( line ),fptr ))
    if (sscanf(line,"%c %d",&c,&val)==2)
        {
        printf("%c %d\n",c,val);
        }

我希望我的答案不会太晚......

于 2017-09-27T17:49:06.963 回答