为了账号安全,请及时绑定邮箱和手机立即绑定

scanf的异常行为

scanf的异常行为

C
哆啦的时光机 2019-09-18 10:18:57
我有如下代码扫描矩阵,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 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

问题是由于留下的'\n'字符(按下 Enter )scanf。

吃掉这些换行符的一种方法是' '先%c放入scanf;


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

        ^

        |

      space

另一种方法是使用一个循环中的所有吃起来\n的getchar()


  int ch;

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


查看完整回答
反对 回复 2019-09-18
?
MM们

TA贡献1886条经验 获得超2个赞

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


不要用 fflush(stdin)


采用:


int c;


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

scanf电话结束后


查看完整回答
反对 回复 2019-09-18
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

这是对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);

        }

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


查看完整回答
反对 回复 2019-09-18
  • 3 回答
  • 0 关注
  • 465 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信