【问题标题】:Problems with input check in c++ [duplicate]C ++中的输入检查问题[重复]
【发布时间】:2016-03-01 09:40:59
【问题描述】:

我希望程序循环直到输入有效(x 是一个 int,并且 x>0),但是当我给它 1,1 时我的程序接受输入并且当我给它一个字符串时无限循环,重复“输入错误!”。

#include <iostream>

using namespace std;

int main()
{
    bool fail;
    int x;
    do{
        cin >> x;
        fail=(cin.fail() || x<=0);
        if (fail){
            cout << "Wrong input!" <<endl;
            cin.clear();
        };
    }while(fail);
    return 0;
}

【问题讨论】:

    标签: c++ input


    【解决方案1】:

    在 if 语句中使用标准成员函数ignore。例如

    std::cin.ignore(std::numeric_limits<std::streamsize>::max(),’\n’);
    

    或者只是

    std::cin.ignore();
    

    用于跳过缓冲区中的无效符号。

    【讨论】:

    • 我应该用它来代替 cin.clear() 吗?
    • @R2DToo 在 cin.clear() 之前插入调用
    • 对于输入 "asd" 仍然保持永远循环.. 对于 "1.1" 它返回 1
    • @R2DToo 对不起。在 clear 调用之后调用 ignore。
    • @R2DToo ignore without arguments 只跳过缓冲区中的一个符号。如果您想忽略所有包含无效数据的缓冲区,请使用第一种调用形式。
    【解决方案2】:

    您可以读取整行并将该行转换为字符串流:

    #include <iostream>
    #include <sstream>
    
    int main()
    {
        bool fail;
        int x;
        do{
            std::string line;
            fail = ! getline(std::cin, line);
            if( ! fail) {
                std::istringstream s(line);
                fail = ! (s >> x) 
                    || x < 0  
                    || ! s.eof(); // The entire line represents an integer
            }
            if(fail) {
                std::cout << "Wrong input!" << std::endl;
            };
        } while(fail);
        return 0;
    }
    

    【讨论】:

    • 是的,它有效!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    相关资源
    最近更新 更多