从用户读取整数

时间:2014-04-02 17:15:28

标签: 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;
    }
    return x;
}

每当我运行此代码时,我得到:

Type in the number for the newsgroup that shall be deleted:
joöä
Bad entry.  Enter a NUMBER: Bad entry.  Enter a NUMBER: Bad entry.  Enter a NUMBER: Bad entry.  Enter a NUMBER: Bad entry.  Enter a NUMBER: Bad entry.  Enter a NUMBER: 8

为什么会写错误的条目&#34;多次? 如果我删除std::cin.clear();std::cin.ignore();,程序就会继续写 Enter a NUMBER: Bad entry.任何人都可以解释为什么会这样做吗?

4 个答案:

答案 0 :(得分:2)

这实际上是old question的部分重复,但其措辞不同,我将在此简要介绍。

  1. 如果没有这两行,您将获得无限打印,因为cin.clear()需要清除cin.fail()正在读取的错误标记。有关详细信息,请参阅链接的问题。
  2. 为什么当那些线路存在时,它仍会不止一次打印?当您执行std::cin >> x;时,您的代码将读取输入中的第一个字符,并尝试将其解析为int。它将失败,然后在循环的下一次迭代中,它将尝试解析下一个字符并再次失败。对于每个失败(即输入中的每个字符),它将打印Bad entry. Enter a NUMBER:。如果你输入一些字符较少的错误输入,你会看到我的意思。
  3. 有多种方法可以解决此问题,但一个简单的解决方法是将整个输入读入字符串,并尝试解析它,而不是直接将cin用于int。以下是一些示例代码,需要使用C++11的{​​{1}}之一进行编译。我已经用你的输入测试了它,它似乎达到你想要的效果。

    #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;
    }
    

答案 1 :(得分:1)

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;
}

请注意,当你有3个非int字符时,它会重复3次,当你有5次时,它会重复5次。 这是因为cin尝试第一个char,失败,尝试第二个char,失败等等,直到解析了所有输入字符。

答案 2 :(得分:0)

如果最后一个cin命令失败,则

cin.fail()返回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: ";
    }

答案 3 :(得分:0)

无论如何都试试......当我直接在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' );
        }
    }
 }