scanf函数遇到非法数据时的问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在使用scanf函数时,我写了如下代码:
#include
#include
int main(void)
{
int m;
while (scanf( "%d ", &m) != 1)
{
printf( "Warning!\nPlease enter again! ");
}
system( "pause ");
return 0;
}
测试程序时,我故意输入一个非整数字符(例如:d),结果程序无休止地打印出 "Waring!Please enter again "。我的本意是如果输入了非法字符,则让用户重新输入。但为什么实现不了呢?应该怎样改正呢?
改为如下内容:(主要是出现输入错误后,没有清空缓冲区的数据流: 但fflush(stdin); 仅限于VC6.0中可以用去,其它C平台可以不支持,不是标准C里的定义,如linux下的gcc3.2就不支持)
#include
#include
int main(void)
{
int m;
while (scanf( "%d ", &m) != 1)
{
fflush(stdin);
printf( "Warning!\nPlease enter again! ");
}
system( "pause ");
return 0;
}
虽然不可以用 fflush(stdin),但是我们可以自己写代码来清空输入缓冲区。只需要在 scanf 函数后面加上几句简单的代码就可以了。
/* C 版本 */
#include
int main( void )
{
int i, c;
for (;;) {
fputs( "Please input an integer: ", stdout);
if ( scanf( "%d ", &i) != EOF ) { /* 如果用户输入的不是 EOF */
/* while循环会把输入缓冲中的残留字符清空 */
/* 读者可以根据需要把它改成宏或者内联函数 */
/* 注:C99中也定义了内联函数,gcc3.2支持 */
while ( (c=getchar()) != '\n ' && c != EOF ) {
;
} /* end of while */
}
printf( "%d\n ", i);
}
return 0;
}