我有一个程序要求用户输入[0,2]范围内的整数。我使用以下链接作为指南。
Good input validation loop using cin - C++
但是,当用户在没有输入数据的情况下按Enter键时,光标只会转到命令提示符中的下一行,而我希望它提示用户输入有效数字。在这种情况下提示用户是否有意义,或者是否有理由不将验证作为单行输入开始?在字符串的情况下,我会使用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");
}
答案 0 :(得分: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;
}
答案 1 :(得分:1)
另一个答案指出了问题。但是,我认为对您的代码稍作修改可以解决您的问题:
int answeredNumber = std::cin.get() - '0';
if(answeredNumber >= 0 && answeredNumber <= 2)
使用&gt;&gt; std::cin
运算符接收格式化的数据,您需要使用get()
和其他函数来接收未格式化的数据。