我尝试在我的程序中验证退出/返回问题的输入,因此用户被迫输入'r'
或'q'
。
我设法让它几乎正常工作。问题是如果用户在开头输入'r'
或'q'
后跟随机字母,则程序接受该输入。关于如何让程序只允许一个'r'
或'q'
?
void exit()
{
char choice;
bool badInput;
do
{
cout << "Press 'r' to return to the menu\nPress 'q' to quit the program\n\n" << endl;
cin >> choice;
badInput = cin.fail();
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
} while (badInput == true && choice == 'r' && choice == 'q' && (cin.peek() == EOF));
if (choice == 'q')
{
system("CLS");
cout << "Bye!\n";
system("PAUSE");
}
else if (choice == 'r')
{
system("CLS");
main();
}
else
{
exit();
}
}
答案 0 :(得分:0)
你有一个非常奇怪的方法来解决这个问题,这个问题很多。特别是,创建一个名为exit()
的函数是有问题的,因为它是一个核心函数,并且递归调用它来尝试获取输入同样不是一个好计划。你已经有了一个循环,你只需要更有效地使用它。
同样,main()
会自动调用,您永远不应该有理由手动调用它。
这是第一次重写:
void getInput()
{
char choice;
while (true)
{
cout << "Press 'r' to return to the menu\nPress 'q' to quit the program\n\n" << endl;
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cin >> choice;
switch (choice)
{
case 'q':
system("CLS");
cout << "Bye!\n";
system("PAUSE");
exit(0);
break;
case 'r':
system("CLS");
doMain();
break;
}
}
}
这显然需要更多工作,但至少应该理论上功能。在您的原始代码中,您要求输入值同时是两个不同的东西,这是不可能的,代码永远不会起作用。
我还鼓励你停止做system("CLS")
和system("PAUSE")
这样的事情,而是用C ++本地做一些事情。这不是可移植的代码,它非常笨重,因为它依赖于20世纪80年代DOS的命令。
答案 1 :(得分:0)
处理输入
大多数实现都使用缓冲的cin
,因此只有在用户按回车键后才会返回输入。如果您不接受此操作,则必须使用与操作系统相关的功能。
如果你没问题,那么如果你读了一个字符,只有第一个字符将被移交:剩下的字符直到输入将等待后续读取。因此,我建议您不要读取单个字符串,而是将整行读入字符串:
void want_exit()
{
const string message="Press 'r' to return to the menu\nPress 'q' to quit the program\n";
string line;
cout << message << endl;
while (getline(cin, line) && line.length()!=1
&& tolower(line[0])!='y' && tolower(line[0])!='n')
{
cout << "Invalid input" <<endl << message <<endl;
line.resize(0);
}
现在,line包含一个有效的char,或者它是空的(在eof过早的情况下,意味着存在输入重定向,并且无论如何都不再有输入)。
处理输入
你不能递归地调用main()
:你应该从函数返回,并组织调用函数以便继续进程
if (line.empty() || tolower(line[0])!='y' ) {
system("CLS"); // This is non portable
cout << "Bye!\nPress enter...";
cin.getch(); // as good as system("PAUSE");
std::exit(0); // be aware of the naming issue !
}
return;
}
调用函数(main()
?)然后在循环中使用它:
while (...) {
...
if (...)
want_exit();
}