判断scanf接收的数据是否为一组纯数字

判断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),仍然会误判数字。而且我发现当纯数字的位数较大(比前面错误数据的位数长)时会判断正确,因此我猜想是因为前面的错误数据被较长数字覆盖后,才能正确判断数字。还望大家赐教!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值