C语言关于scanf()的缓冲问题

智商已暴露 发布于 2012/03/27 16:00
阅读 499
收藏 0
int inputNum;
scanf("%4d",&inputNum);
printf("your input string is :%d\r\n",inputNum);

这段代码中,我希望限制输入的数字只有4位数。可是如果输入5位的话第3行打印两边,第二遍是第五位数。如下图:

如何才能消除scanf缓冲的第五位数

加载中
1
中山野鬼
中山野鬼

呵呵,你这个问题比较典型。不过我先说结论和建议,我实在搞不懂你们使用scanf ,getc都有什么作用。当你们希望他们作为程序待处理的数据出现时。

现在我说一下scanf格式化的问题。其实在C的国际标准里面都有。

参考C国际标准里的例子,如下

#include <stdio.h>
....
int i;
float f;
char str[50];
scanf("%2d%f*d%[0123456789]",&i,&x,str);

//如果你输入56789 0123 56a72
//则 i 里面是 56,
//则 x里面是 789.0
//跳过 0123,str里面是 '5','6','\0'

你用%nd的方式,只能读取对应n数据上来,并不会对输入管道内的数据进行清楚。你需要用刷新操作。这个你自己去找资料。因为你找到资料就能理解,printf,scanf实际也是文件管道的操作。只不过你scanf的输入源的文件是键盘。这和stderr这个文件,默认是屏幕一个道理。

回到最开始的建议,对于数据的输入,采用格式化的方式不是问题,问题是 ,你首先的按照标准文件的方式,养成fopen,fclose的习惯。而不要采用默认方式。这和把所有log都望屏幕丢并不算有效工作一个道理。那么采用标准fopen,fclose的方式,你通常的做法应该是对输入源一个文件中的所有当作字符串看待,根据你BUF的大小分批读上来,再对BUF内的字符串进行对应的转换。不要动不动就使用scanf.

如果是希望能获取键盘的控制信息,来判断程序走向,仍然建议你使用getc来实现。

木木陶
木木陶
大师傅啊 你说问题真的是一条一条啊 ,我都看乱了,不是很理解哦。呵呵
0
上岸的鱼
上岸的鱼
楼上牛  受教
0
木木陶
木木陶
scanf()函数后面加一个fflush(stdin,NULL);
返回顶部
顶部