行云

行至水穷处,坐看云起时。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

刚学C的时候,遇到如下问题:
scanf("%d", n);
scanf("%c", ch);
本来我应该要按两次回车输入才结束吧。可是每次我输入一个整数,然后按回车准备输入一个字符的时候,输入就结束了。
这个问题郁闷了好久。书上也没讲。后来找到了方法,在scanf("%d", n)之后调用fflush(stdin)来刷新输入缓冲。再后来,看到了
更好的解决方法:

scanf("%d%*c", &n);
scanf("%c", &ch);

后来遇到了另一个问题
scanf("%s", str1);
gets(str2)
这和上面类似。第一次回车之后,str2接收了一个空串。也可以在之前用fflush(stdin)来解决。或者:
scanf("%s%*c", str1);
gets(str2);
还可以
scanf("%s", str1);
getchar();
gets(str2);

总的说来,%c会把输入缓冲中的第一个字符做为输入。gets()在遇到缓冲中第一个'\n'是结束输入。

一直习惯用fflush(stdin)来解决上面遇到的问题,直到有一次,做ACM的题,本来题很简单,可是我提交了10来次,
改了又改,还是WA。抓狂~~~
后来对照别人的代码发现就是这个fflush(stdin)的区别。想来是fflush并不只是把上一次输入的回车清楚掉,还把后面
的缓冲也清楚掉了。这造成输入数据不完整,所以一直WA。都是没有充分理解fflush(stdin)和当前环境造成的。
PS:要知其然还要知其所有然,要不然遇到问题时候,经常无从下手。懂得原理,以不变应万变。

posted on 2013-04-08 10:59  windflying  阅读(885)  评论(0编辑  收藏  举报