鱼C论坛

 找回密码
 立即注册
查看: 73|回复: 5

关于判断用户输入合法性的问题

[复制链接]
发表于 2021-7-22 21:08:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 LLK4ever 于 2021-7-22 21:15 编辑

代码需求:让用户输入4个整数,计算输入四个整数的和与平均值
请问如何改这个程序,让它可以在用户输入浮点数(比如2.3)时,也报错?
现在的代码,输入2.3后现象如图所示
正常应该是:
请输入四个整数
请输入第一个数
2.3
请输入一个合法的值
1
请输入第2个数
。。。

请问我到底哪里错了

这个咋弄悬赏啊,咋变成付费了



  1. int main(void)
  2. {
  3.         const unsigned short ITEM=4;
  4.         int a[ITEM];
  5.         int sum=0;
  6.         float average=0;
  7.                
  8.         std::cout<<"please enter"<<ITEM<<"numbers:"<<std::endl;
  9.         for(int i=0;i<ITEM;i++)
  10.         {
  11.                 std::cout<<"请输入第"<<(i+1)<<"个数"<<std::endl;
  12.                 while(!(std::cin>>a[i]))            //判断输入合法性
  13.                 {
  14.                         std::cin.clear();
  15.                         std::cin.ignore(100,'\n') ;
  16.                         std::cout<<"请输入一个合法的值" <<std::endl;
  17.                 }
  18.        
  19.                 sum += a[i];
  20.                 average = sum/ITEM;
  21.         }
  22.        
  23.         std::cout<<"和为"<<sum<<"平均值为"<<average<<std::endl;
  24.        
  25.         return 0;
  26.        
  27. }
复制代码
1626958812(1).png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-7-22 21:54:54 | 显示全部楼层
  1. #include <iostream>
  2. #include <string>
  3. #include <sstream>

  4. bool verify(const std::string &s) {
  5.     bool flag = false;
  6.     for(const auto &i: s) {
  7.         if(isdigit(i)) flag = true;
  8.         else if(isspace(i)) {
  9.         } else return false;
  10.     }
  11.     return flag;
  12. }

  13. int read_int(std::istream &is) {
  14.     std::string line;
  15.     while(true) {
  16.         std::getline(is, line);
  17.         if(verify(line)) {
  18.             std::stringstream ss(line);
  19.             int n;
  20.             ss >> n;
  21.             return n;
  22.         }
  23.         std::cout << "输入错误,请重新输入" << std::endl;
  24.     }
  25. }

  26. int main() {
  27.     std::cout << read_int(std::cin) << std::endl;
  28.     return 0;
  29. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2021-7-22 22:00:46 | 显示全部楼层
本帖最后由 LLK4ever 于 2021-7-22 22:01 编辑

请问有适合小白一点的答案吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-7-22 22:05:44 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-7-22 22:06:21 | 显示全部楼层
  1. #include <iostream>

  2. int main(void)
  3. {
  4.     const unsigned short ITEM=4;
  5.     int a[ITEM];
  6.     int sum=0;
  7.     float average=0;

  8.     std::cout<<"please enter"<<ITEM<<"numbers:"<<std::endl;
  9.     for(int i=0;i<ITEM;i++)
  10.     {
  11.         std::cout<<"请输入第"<<(i+1)<<"个数"<<std::endl;
  12.         /*
  13.         while(!(std::cin>>a[i]))            //判断输入合法性
  14.         {
  15.             std::cin.clear();
  16.             std::cin.ignore(100,'\n') ;
  17.             std::cout<<"请输入一个合法的值" <<std::endl;
  18.         }
  19.         */
  20.         while(true) {
  21.             std::cin >> a[i];
  22.             char ch;
  23.             std::cin >> ch;
  24.             if(ch != '.') {
  25.                 std::cin.unget();
  26.                 break;
  27.             }
  28.             std::cin.ignore(100,'\n') ;
  29.             std::cout<<"请输入一个合法的值" <<std::endl;
  30.         }

  31.         sum += a[i];
  32.         average = sum/ITEM;
  33.     }

  34.     std::cout<<"和为"<<sum<<"平均值为"<<average<<std::endl;

  35.     return 0;

  36. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2021-7-24 14:26:34 | 显示全部楼层
楼上提供的代码还是有问题的
运行结果如下:
不符合需求
1627107900(1).png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1

GMT+8, 2021-8-2 18:26

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表