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
另一种方法是使用一个循环吃掉所有\n
由getchar()
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); }
我希望我的回答不会太晚……