scanf的exception行为

我有如下代码扫描矩阵,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。

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

问题是由于scanf留下的'\n'字符(在按Enter键时 )。
吃掉这些换行符的一种方法是在scanf放置%c ' '之前的%c ;

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

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

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

您需要从之前的scanf跳过尾随换行符

不要使用fflush(stdin)

使用:

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

scanf之后

这是对vuppala srikar的回答。 他的问题“ 从文本文件[重复]读取输入时fscanf问题 ”在我看来并不完全相同:

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

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