C标准输入之伤

刚学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:要知其然还要知其所有然,要不然遇到问题时候,经常无从下手。懂得原理,以不变应万变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值