我现在正在进入c ++,现在我想知道捕获无效输入的最常见/最好的方法。我很想回答这个大问题,但我更具体的问题如下。
我想要一个来自用户的char。如果char为'y',那么它将重复,如果是'n'则程序将关闭。如果我输入多个字符,那么它将重复与字符数相同的次数,例如我输入'hello'它将显示我的输出5次。我假设它读取每个char并遍历整个循环然后读取下一个char。我怎样才能让它出现一次?
bool valid = 0;
while(valid)
{
...
bool secValid = 0;
while(secValid == 0)
{
cout << "To enter another taxable income type 'y': \n\n";
char repeat = NULL;
cin >> repeat;
if(repeat == 'y')
{
valid = 0;
secValid = 0;
system("cls");
}else if(repeat == 'n')
{
return;
}else
{
secValid = 1;
}
}
}
答案 0 :(得分:3)
您可以将其结构如下:
while(true) {
cout << "Repeat (y/n)? ";
string line;
if(!getline(cin, line))
break; // stream closed or other read error
if(line == "y") {
continue;
} else if(line == "n") {
break;
} else {
cout << "Invalid input." << endl;
}
}
示例会话:
Repeat (y/n)? y
Repeat (y/n)? foo
Invalid input.
Repeat (y/n)? n
这里我们使用std::getline
来获取整行输入,而不是一次获得一个字符。
答案 1 :(得分:2)
std::getline()
:
std::string line;
std::getline(std::cin, line);
if (line == "y") {
// handle yes
}
else if (line == "n") {
// handle no
}
else {
// handle invalid input
}
答案 2 :(得分:2)
使用std::getline
标题中的<string>
将行输入到std::string
答案 3 :(得分:2)
同样,检查字符串“y”或“n”时,最好使用upcased字符串。例如
std::string YES = "Y";
std::string NO = "N";
...
std::string line;
std::getline(std::cin, line);
std::transform(line.begin(), line.end(), line.begin(), std::toupper);
if (line == YES)
{
...
}
else if (line == NO)
{
..
。 }