LLK4ever 发表于 2021-7-22 21:08:00

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

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

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

请问我到底哪里错了

这个咋弄悬赏啊,咋变成付费了{:10_277:}



int main(void)
{
        const unsigned short ITEM=4;
        int a;
        int sum=0;
        float average=0;
               
        std::cout<<"please enter"<<ITEM<<"numbers:"<<std::endl;
        for(int i=0;i<ITEM;i++)
        {
                std::cout<<"请输入第"<<(i+1)<<"个数"<<std::endl;
                while(!(std::cin>>a))            //判断输入合法性
                {
                        std::cin.clear();
                        std::cin.ignore(100,'\n') ;
                        std::cout<<"请输入一个合法的值" <<std::endl;
                }
       
                sum += a;
                average = sum/ITEM;
        }
       
        std::cout<<"和为"<<sum<<"平均值为"<<average<<std::endl;
       
        return 0;
       
}

人造人 发表于 2021-7-22 21:54:54

#include <iostream>
#include <string>
#include <sstream>

bool verify(const std::string &s) {
    bool flag = false;
    for(const auto &i: s) {
      if(isdigit(i)) flag = true;
      else if(isspace(i)) {
      } else return false;
    }
    return flag;
}

int read_int(std::istream &is) {
    std::string line;
    while(true) {
      std::getline(is, line);
      if(verify(line)) {
            std::stringstream ss(line);
            int n;
            ss >> n;
            return n;
      }
      std::cout << "输入错误,请重新输入" << std::endl;
    }
}

int main() {
    std::cout << read_int(std::cin) << std::endl;
    return 0;
}

LLK4ever 发表于 2021-7-22 22:00:46

本帖最后由 LLK4ever 于 2021-7-22 22:01 编辑

请问有适合小白一点的答案吗?{:10_277:}

万千只cnm 发表于 2021-7-22 22:05:44

用ctype.h来判断呀
https://www.runoob.com/cprogramming/c-standard-library-ctype-h.html

人造人 发表于 2021-7-22 22:06:21

#include <iostream>

int main(void)
{
    const unsigned short ITEM=4;
    int a;
    int sum=0;
    float average=0;

    std::cout<<"please enter"<<ITEM<<"numbers:"<<std::endl;
    for(int i=0;i<ITEM;i++)
    {
      std::cout<<"请输入第"<<(i+1)<<"个数"<<std::endl;
      /*
      while(!(std::cin>>a))            //判断输入合法性
      {
            std::cin.clear();
            std::cin.ignore(100,'\n') ;
            std::cout<<"请输入一个合法的值" <<std::endl;
      }
      */
      while(true) {
            std::cin >> a;
            char ch;
            std::cin >> ch;
            if(ch != '.') {
                std::cin.unget();
                break;
            }
            std::cin.ignore(100,'\n') ;
            std::cout<<"请输入一个合法的值" <<std::endl;
      }

      sum += a;
      average = sum/ITEM;
    }

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

    return 0;

}

LLK4ever 发表于 2021-7-24 14:26:34

楼上提供的代码还是有问题的
运行结果如下:
不符合需求
页: [1]
查看完整版本: 关于判断用户输入合法性的问题