C++ 从用户读取整数

C++ 从用户读取整数,c++,C++,我正试图从终端读取一个整数。这是我的密码: int readNumber() { int x; std::cin >> x; while(std::cin.fail()) { std::cin.clear(); std::cin.ignore(); std::cout << "Bad entry. Enter a NUMBER: "; std::cin >> x;

我正试图从终端读取一个整数。这是我的密码:

int readNumber()
{
    int x;
    std::cin >> x;
    while(std::cin.fail())
    {
        std::cin.clear();
        std::cin.ignore();
        std::cout << "Bad entry. Enter a NUMBER: ";
        std::cin >> x;
    }
    return x;
}
为什么它会多次写“坏条目”? 如果我删除
std::cin.clear()
标准::cin.ignore(),程序只是一直在写

输入一个数字:输入错误。
有人能解释一下它为什么会这样做吗?

这实际上是一个部分重复的数字,但它的措辞非常不同,因此我将在这里简要介绍它

  • 如果没有这两行,您将获得无限打印,因为需要清除
    cin.clear()
    以清除
    cin.fail()
    正在读取的错误标志。有关详细信息,请参见链接问题
  • 为什么在有这些行的情况下,它还会打印多次?当你做
    std::cin>>x,代码将读取输入中的第一个字符,并尝试将其解析为
    int
    。它将失败,然后在循环的下一次迭代中,它将尝试解析下一个字符并再次失败。对于每次失败(即输入中的每个字符),它将打印
    错误条目。输入一个数字:
    。如果你用更少的字符输入一些错误的输入,你就会明白我的意思
  • 有多种方法可以解决此问题,但一种简单的解决方法是将整个输入读取到字符串中,并尝试对其进行解析,而不是使用
    cin
    直接将其转换为
    int
    。下面是一些示例代码,需要使用
    C++11
    的各种方法之一进行编译。我已经用你的输入对它进行了测试,它似乎达到了你想要的效果

    #include <iostream>
    #include <string>
    #include <stdexcept>
    
    bool tryParse(std::string& input, int& output) {
        try{
            output = std::stoi(input);
        } catch (std::invalid_argument) {
            return false;
        }
        return true;
    }
    int main(){
        std::string input;
        int x;
    
        getline(std::cin, input);
    
        while (!tryParse(input, x))
        {
            std::cout << "Bad entry. Enter a NUMBER: ";
            getline(std::cin, input);
        }
        return x;
    }
    
    #包括
    #包括
    #包括
    booltryparse(标准::字符串和输入、int和输出){
    试一试{
    输出=标准::stoi(输入);
    }catch(std::无效的_参数){
    返回false;
    }
    返回true;
    }
    int main(){
    std::字符串输入;
    int x;
    getline(标准::cin,输入);
    而(!tryParse(输入,x))
    {
    std::cout
    cin.fail()
    如果最后一个cin命令失败,则返回true,否则返回false

    请尝试以下方法:

        while(1)
        {
            std::cin >> x;
            if (!std::cin.fail()) break;
            std::cin.clear();
            std::cin.ignore(10000,'\n');
            std::cout << "Bad entry. Enter a NUMBER: ";
        }
    
    while(1)
    {
    标准:cin>>x;
    如果(!std::cin.fail())中断;
    std::cin.clear();
    标准::cin.ignore(10000,“\n”);
    
    std::cout无论如何尝试一下……因为我直接在stackoverflow中键入它可能会有编译错误

    int readNumber()
    {
       int x=0; 
       while(true)
       {
            std::cin >> x;
            if(!std::cin.fail()){
                break;
            }
            else{
                std::cout << "Bad entry. Enter a NUMBER: " << std::endl;
                std::cin.clear();
                std::cin.ignore( std::numeric_limits<streamsize>::max(), '\n' );
            }
        }
     }
    
    int readNumber()
    {
    int x=0;
    while(true)
    {
    标准:cin>>x;
    如果(!std::cin.fail()){
    打破
    }
    否则{
    std::cout
    int main(){
    字符*输入;
    std::cin>>输入;
    INTX=std::atoi(输入);
    而(x==0&&strcmp(输入,“0”)!=0){
    std::cout>输入;
    x=std::atoi(输入);
    }
    返回x;
    }
    
    请注意,当您有3个非int字符时,它将重复3次,当您有5个时,它将重复5次。
    这是因为cin尝试第一个字符,失败,尝试第二个字符,失败等等,直到你的所有输入字符都被解析。

    尝试在你的while循环中添加一个中断。应该解决你的问题没有帮助。我在if(cin>>x)My bad中添加了一个中断。很累,但无论如何添加了一个正确的答案,应该可以工作。(: Cheers@user2975699,简短的回答是,您在每个字符上都失败了,并且为每个失败打印了错误消息。@merlin2011,我也这么认为,但是有4个字符,但错误消息出现了6次。
    int readNumber()
    {
       int x=0; 
       while(true)
       {
            std::cin >> x;
            if(!std::cin.fail()){
                break;
            }
            else{
                std::cout << "Bad entry. Enter a NUMBER: " << std::endl;
                std::cin.clear();
                std::cin.ignore( std::numeric_limits<streamsize>::max(), '\n' );
            }
        }
     }
    
    int main() {
        char* input;
        std::cin >> input;
        int x = std::atoi(input);
        while(x == 0 && strcmp(input, "0") != 0) {
            std::cout << "Bad entry. Enter a NUMBER: ";
            std::cin >> input;
            x = std::atoi(input);
        }
        return x;
    }