【问题标题】:How do I implement single line integer type command line input validation using cin?如何使用 cin 实现单行整数类型命令行输入验证?
【发布时间】:2012-05-28 13:51:20
【问题描述】:

我有一个程序要求用户输入 [0,2] 范围内的整数。我使用以下链接作为指南。

Good input validation loop using cin - C++

但是,当用户在不输入数据的情况下按下回车键时,光标只会转到命令提示符的下一行,而我希望它提示用户输入有效数字。在这种情况下提示用户是否有意义,或者是否有理由不将验证作为单行输入开始?在字符串的情况下,我会使用 getline 来解决这个问题,在这种情况下我应该以某种方式使用它吗?这是我的代码,基于上面的链接:

#include <iostream>

int main()
{
    int answeredNumber;
    while(1)
    {
        std::cout << "Enter your answer: ";
        if(std::cin >> answeredNumber && answeredNumber >= 0 && answeredNumber <= 2)
        {
            break;
        }
        else
        {
            std::cout << "Please enter a valid answer: " ;
            std::cin.clear();
          std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        }
    }
    system("pause");
}

【问题讨论】:

    标签: c++


    【解决方案1】:

    另一个答案说明了问题。但是,我认为对您的代码稍作修改将解决您的直接问题:

    int answeredNumber = std::cin.get() - '0';
    if(answeredNumber >= 0 && answeredNumber <= 2)
    

    std::cin用>>操作符接收格式化数据,你需要使用get()等函数接收未格式化数据。

    【讨论】:

    • get 没有得到一个 character 然后将其转换为整数吗?我认为您可能需要将其转换为实际值(例如,通过减去“0”)。
    【解决方案2】:

    这是因为使用cin 获取整数将跳过前导空格,包括换行符。没有简单的方法。

    如果你想要基于行的输入,你可以将你的输入值作为一个字符串然后解释:

    #include <iostream>
    #include <sstream>
    #include <string>
    
    int main (void) {
        std::string inputLine;
        int answer;
        std::cout << "Enter your answer: ";
        while(1) {
            getline (std::cin, inputLine);
            std::stringstream ss (inputLine);
            if ((ss >> answer))
                if ((answer >= 0) && (answer <= 2))
                    break;
            std::cout << "No, please enter a VALID answer: " ;
        }
        std::cout << "You entered " << answer << '\n';
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-20
      • 2013-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多