scanf的异常行为

时间:2013-10-12 17:51:37

标签: c scanf

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

我正在使用Visual Studio 2010。

每次我得到一个char它会使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.

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

3 个答案:

答案 0 :(得分:5)

问题是'\n'遗留下来的scanf个字符(在按下 Enter 时)。 消耗这些换行符的一种方法是在' '之前%c放置scanf;

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

另一种方法是使用循环来占用所有\n getchar()

  int ch;
  while((ch=getchar())!='\n' && ch != EOF );

答案 1 :(得分:2)

您需要跳过之前scanf

的尾随换行符

请勿使用fflush(stdin)

使用:

int c;

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

答案 2 :(得分:0)

以下是 vuppala srikar 的答案。 他的问题&#34; fscanf issue while reading input from text file [duplicate]&#34;在我看来并不完全相同:

在他的问题中,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);
        }

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