尝试验证用户输入时遇到问题。这是我的代码:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string choice;
cout << "Please type something: ";
cin >> choice;
cin.ignore();
while (choice != "1" && choice != "2" && choice != "3" && choice != "4" && choice != "5")
{
cout << "Incorrect choice! Please input a valid number: >_";
cin >> choice;
cin.ignore();
}
return 0;
}
当我输入“ wronginput”时,该输入落入while循环并显示
错误的选择!请输入一个有效的数字:> _
哪个好。但是,当我尝试“错误输入”时,会得到“奇怪”的版本:
错误的选择!请输入有效的数字:> _错误的选择!请输入一个有效的数字:> _
我的猜测是罪魁祸首。有什么办法可以解决这个问题吗?谢谢。
答案 0 :(得分:1)
当您输入“错误输入”作为输入时,该行
cin >> choice;
在choice
中读取并存储“错误”。
行
cin.ignore();
仅忽略一个字符。因此,您将在流中添加“输入”和后续换行符。下次读choice
时,您会在choice
中得到“输入”。
这说明了程序的行为。
为了修复它,请确保忽略该行的其余部分,而不仅仅是一个字符。使用
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
添加
#include <limits>
能够使用std::numeric_limits
。
答案 1 :(得分:0)
这是因为std::cin >> choice
是一种格式化的输入,它将把所有内容读取到下一个空格。
当您输入“ wronginput”时,它将全部读取,但是如果您输入“ wrong input”,则只会读取“ wrong”部分。您的while
循环将触发,在其主体内再次执行std::cin >> choice
,它将显示为“输入”。
此行为使您的程序连续两次输出消息。
如何解决?而不是读取单个令牌,直到下一个空格,请考虑读取整行。
如何实现?只需使用
std::cin >> choice;
使用std::getline
函数:
std::getline(std::cin, choice);
在while
循环的内部和外部。