判断scanf接收的数据是否为一组纯数
为了程序的健壮性,我们需要检查scanf函数接收的数据是否符合输入要求,并提示用户重新输入正确的数据。
以判断输入是否是正整数为例,有以下几种方法:
方法(1) 利用scanf函数的返回值
scanf()读取匹配format(格式)字符串的输入scanf()的返回值是成功赋值的变量数量, 发生错误时返回EOF.
while(1){
//成功读入一个正整数
if(scanf("%d",&line) == 1 && line>0){
break;
}
else
{
printf("WrongInput,please input a Positive Integer !\n");
}
fflush(stdin);//注意刷新标准输入缓冲区
}
问题:以数字开头的不合法输入无法判断。
方法(2) 作为一个字符串读入,然后将字符串转换为整数。
char str[128];
while(wrongInput){
if(scanf("%s",str) == EOF)
continue;
num = 0;
for(int i=0;i<strlen(str);i++)
{
if(isdigit(str[i])){
num = 10*num+(str[i]-'0');
//防止输入数据溢出
if(num >INT_MAX/10 || (num == INT_MAX && str[i]-'0' > INT_MAX%10)){
fflush(stdin);
printf("WrongInput,please input a Positive Integer within 0~2147483647 !\n");
break;
}
if(i == strlen(str) - 1)
wrongInput = false;
}
else{
fflush(stdin);
printf("WrongInput,please input a Positive Integer !\n");
break;
}
}
}
这一段程序不仅能很好判断scanf函数接收到的数据是否为正整数,还能判断数据是否溢出,具有较好鲁棒性。
方法(3) 使用if (strlen(stdin->_ptr)> 2)条件判断
while(1){
num = 0;
fflush(stdin);
scanf("%d", &num);
//输入数据num非纯数字
if (strlen(stdin->_ptr) > 2 || num <= 0){
fflush(stdin);
printf("WrongInput,please input a Positive Integer !\n");
}
else{
break;
}
}
优点:代码简洁。
缺点:
(1)缺少溢出检测功能。
(2) 不易使用,容易出错。如下图,当输入缓冲区中存在非法数据后,对正常数据的判断出现误判,直到数据位数较多时才能判断正确。
刚开始以为是缓冲区没有刷新导致if (strlen(stdin->_ptr)> 2)判断语句出错,但即使在scanf前后加多个fflush(stdin),仍然会误判数字。而且我发现当纯数字的位数较大(比前面错误数据的位数长)时会判断正确,因此我猜想是因为前面的错误数据被较长数字覆盖后,才能正确判断数字。还望大家赐教!