我刚刚完成了这个大理石游戏程序的工作,它工作正常,除了我需要做一件事来保护它免受无效输入。程序正确响应所有基于整数的无效输入,但如果输入非整数,程序将崩溃。我一直在使用cin.fail()函数,它可以工作,但然后陷入循环。如果用户输入非整数,我希望程序告诉用户输入无效并提示用户再次输入他们的选择。
我添加了返回1;在无效的输入语句之后结束程序而不是崩溃,但这不是我想要做的。我希望它打印“无效输入”,然后重新提示用户再次输入他们的选择。
#include <iostream>
using namespace std;
int main()
{
cout << "*** The Game of Nim ***\n\n" << endl;
string player1, player2, currentPlayer;
int marbles, selection;
bool isDone = false;
cout << "Enter a name for Player 1: ";
cin >> player1;
cout << "Enter a name for Player 2: ";
cin >> player2;
cout << "Enter how many marbles you would like to start with in the pile: ";
cin >> marbles;
cout << "\nThere are " << marbles << " marbles in the pile\n" << endl;
currentPlayer = player1;
do
{
bool turnDone = false;
while (turnDone == false && marbles != 0)
{
if (currentPlayer == player1)
{
cout << currentPlayer << "\n";
cout << "How many marbles would you like to draw? : ";
cin >> selection;
if (cin.fail())
{
cout << "\nInvalid Input\n";
return 1;
}
if (selection < marbles / 2 + 1 && marbles > 1 && selection != 0)
{
marbles = marbles - selection;
if (marbles == 1)
{
cout << "\nUh Oh! There is only 1 marble remaining in the pile\n" << endl;
currentPlayer = player2;
turnDone = true;
break;
}
cout << "\nThere are " << marbles << " marbles remaining in the pile\n" << endl;
currentPlayer = player2;
turnDone = true;
}else if (marbles == 1)
{
marbles = marbles - selection;
if (marbles <= 0)
{
cout << "\nThere are 0 marbles remianing in the pile\n";
cout << "You drew the last marble!" << endl;
cout << "You lose!\n\n" << endl;
cout << player2 << " wins\n\n" << endl;
turnDone = true;
return 0;
}
}else if (selection == 0 || selection > marbles / 2 + 1)
{
cout << "\nYou must draw at least 1 marble, and no more than half the pile\n" << endl;
}
}else if (currentPlayer == player2)
{
cout << currentPlayer << "\n";
cout << "How many marbles would you like to draw? : ";
cin >> selection;
if (selection < marbles / 2 +1 && marbles > 1 && selection != 0)
{
marbles = marbles - selection;
if (marbles == 1)
{
cout << "\nUh Oh! There is only 1 marble remaining in the pile\n" << endl;
currentPlayer = player1;
turnDone = true;
break;
}
cout << "\nThere are " << marbles << " marbles remaining in the pile\n" << endl;
currentPlayer = player1;
turnDone = true;
}else if (marbles == 1)
{
marbles = marbles - selection;
if (marbles <= 0)
{
cout << "\nThere are 0 marbles remianing in the pile\n";
cout << "You drew the last marble!" << endl;
cout << "You lose!\n\n" << endl;
cout << player1 << " wins!\n\n" << endl;
turnDone = true;
return 0;
}
}else if (selection == 0 || selection > marbles / 2 + 1)
{
cout << "\nYou must draw at least 1 marble, and no more than half the pile\n" << endl;
}
}
}
}while (isDone == false);
return 0;
}
答案 0 :(得分:1)
以下是在程序中使用std :: cin.fail()的方法:
int marbles;
bool check = false;
do {
std::cout << "Enter how many marbles you would like to start with in the pile: ";
std::cin >> marbles;
if (std::cin.fail()) {
std::cin.clear();
std::cin.ignore();
}
else
check = true;
}while(!check);
cin.fail()将返回一个布尔说法是否已收到预期收入
如果没有,你将不得不使用clear()将失败值置为false然后忽略给定的输入
希望有所帮助
答案 1 :(得分:0)
以字符串形式获取用户输入并检查其中是否有任何数字:
std::string input;
std::cin >> input;
int marbles = std::atoi(input.c_str()); //Returns the first number met in the char table, if there is none, returns 0
if(marbles)
std::cout << marbles;