如何忽略 C++ 中错误的 cin 输入?
How to ignore wrong cin input in C++?
这是 4x4 井字游戏的代码。我是编程新手。我不知道如何忽略用户的错误输入。我试着搜索 Google,我找到了 cin.clear()
和 cin.ignore()
。他们确实工作了一点,但没有完全工作。例如,如果用户输入 11111111 4 o
作为输入,程序将退出而不是忽略它。如何忽略这个输入?
cin.clear()
和 cin.ignore()
在做什么?
char game[4][4];
int r, c;
char ans;
cin >> r >> c >> ans;
--r, --c;
if (!check_ok(r, c, ans)){
cout << "try again: select available ones only!!!\n";
--count;//count checks for 16 turns through while loop
}else{
game[r][c] = ans;
++count1;
}
bool Game::check_ok(int a, int b, char an) {
if (game[a][b] == ' ' && a < 4 && b < 4 && ((count1 % 2 == 0 && an == 'x') || (count1 % 2 != 0 && an == 'o'))){
game[a][b] = an;
return true;
}
else{
cin.clear();
cin.ignore();
return false;
}
}
我认为与其忽略错误的输入,不如将用户的输入限制为理想的输入。也许 if 语句可以帮助
if(input != ideal_input)
{
cout>>"invalid input";
}
else
{
//progress in the game
}
好的。用户输入很难。
交互式用户输入是基于行的。
用户输入一些值,然后点击 return。这会刷新流并解除阻塞读取器以从流中获取值。因此,您应该将输入代码设计为基于行的。
第一个问题似乎是所有输入都在一行上,还是他们输入的值之间有 return?您可以通过向用户提供一些输出来确定这一点,然后按照您的说明定义的规则进行操作。
所以让我们做一个基于行的输入示例:
do {
// Your instructions can be better.
std::cout << "Input: Row Col Answer <enter>\n";
// Read the user input. 1 Line of text.
std::string line;
std::getline(std::cin, line);
// convert user input into a seprate stream
// See if we can correctly parse it.
std::stringstream linestream(std::move(line));
// Notice we check if the read worked.
// and that the check_ok() returns true.
// No point in call check_ok() if the read failed.
if (linestream >> r >> c >> ans && check_ok(r, c, ans)) {
break;
}
std::cout << "Invalid Input. Please try again\n";
}
while(true);
这是 4x4 井字游戏的代码。我是编程新手。我不知道如何忽略用户的错误输入。我试着搜索 Google,我找到了 cin.clear()
和 cin.ignore()
。他们确实工作了一点,但没有完全工作。例如,如果用户输入 11111111 4 o
作为输入,程序将退出而不是忽略它。如何忽略这个输入?
cin.clear()
和 cin.ignore()
在做什么?
char game[4][4];
int r, c;
char ans;
cin >> r >> c >> ans;
--r, --c;
if (!check_ok(r, c, ans)){
cout << "try again: select available ones only!!!\n";
--count;//count checks for 16 turns through while loop
}else{
game[r][c] = ans;
++count1;
}
bool Game::check_ok(int a, int b, char an) {
if (game[a][b] == ' ' && a < 4 && b < 4 && ((count1 % 2 == 0 && an == 'x') || (count1 % 2 != 0 && an == 'o'))){
game[a][b] = an;
return true;
}
else{
cin.clear();
cin.ignore();
return false;
}
}
我认为与其忽略错误的输入,不如将用户的输入限制为理想的输入。也许 if 语句可以帮助
if(input != ideal_input)
{
cout>>"invalid input";
}
else
{
//progress in the game
}
好的。用户输入很难。
交互式用户输入是基于行的。
用户输入一些值,然后点击 return。这会刷新流并解除阻塞读取器以从流中获取值。因此,您应该将输入代码设计为基于行的。
第一个问题似乎是所有输入都在一行上,还是他们输入的值之间有 return?您可以通过向用户提供一些输出来确定这一点,然后按照您的说明定义的规则进行操作。
所以让我们做一个基于行的输入示例:
do {
// Your instructions can be better.
std::cout << "Input: Row Col Answer <enter>\n";
// Read the user input. 1 Line of text.
std::string line;
std::getline(std::cin, line);
// convert user input into a seprate stream
// See if we can correctly parse it.
std::stringstream linestream(std::move(line));
// Notice we check if the read worked.
// and that the check_ok() returns true.
// No point in call check_ok() if the read failed.
if (linestream >> r >> c >> ans && check_ok(r, c, ans)) {
break;
}
std::cout << "Invalid Input. Please try again\n";
}
while(true);