所以我刚刚学习了输入验证,但是遇到了问题。我强迫用户输入一个数字,而不是一个有效的字符串,但是如果用户输入一个数字(包含在开关案例中的数字)和一个字符串,那么程序就会崩溃。有关改变内容的任何提示,以便验证适用于所有内容吗?
int menu(double pi) //menu for choosing a shape
{
int choice = 0;
cout << "Please select what you wish to calculate:\n\n1 - Area of a Circle\n\n2 - Circumference of a Circle\n\n3 - Area of a Rectangle\n\n4 - Area of a Triangle\n\n5 - Volume of a Cuboid\n\n ";
while (!(cin >> choice))
{
cout << "Invalid input, please enter a number of 1-5\n\n";
cin.clear();
cin.ignore(100, '\n');
}
system("CLS");
switch (choice) //switch case for each shape
{
case 1:
circleArea(pi);
break;
case 2:
circleCircum(pi);
break;
case 3:
rectanArea();
break;
case 4:
triangArea();
break;
case 5:
cubVol();
break;
default:
cout << "Invalid input! Please try again.\n\n";
break;
}
return 0;
}
答案 0 :(得分:0)
使用
的问题cin >> choice
输入数字时,>>
将停在第一个非数字输入处,只要有数字输入开始,它就会将其视为有效读数。这意味着,就2L
而言,2.0
,-1T
和cin
等内容都是有效的整数输入。它只是将无效部分留在流中。正是这个剩余的蒸汽输入在下一次输入操作时弄乱了程序。
解决此问题的一种方法是使用std::string
将输入读入getline
,然后解析字符串以确保其包含有效输入。如果你想获得一个int
int choice;
std::string input;
std::size_t pos;
do
{
std::cout << "Enter Choice: ";
std::getline(cin,input);
choice = stoi(input, &pos);
} while(pos != input.size());
这样可以确保您在按下input
之前阅读所有内容并且只有在输入的所有内容都可以转换为有效的int
后才能停止循环。