1

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

使用 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");
}
4

2 回答 2

3

那是因为获得一个整数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;
}
于 2012-05-22T04:49:31.970 回答
1

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

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

std::cin用 >> 操作符接收格式化的数据,你将需要使用get()和其他函数来接收未格式化的数据。

于 2012-05-22T04:57:10.923 回答