我试图验证char的简单输入,但是如果用户在不键入char的情况下按Enter键,它只会在控制台中打印一个空行,直到输入字符。我想接受输入密钥作为无效输入并继续我的验证,而不是只是去一个空行。
cout << "Enter room type. (S)tandard or (P)remium: ";
char roomType;
cin >> roomType;
while (cin.fail() || roomType != 's' && roomType != 'S' && roomType != 'p' && roomType != 'P')
{
cin.clear();
cin.ignore(80, '\n');
cout << "Error. Enter room type again: ";
cin >> roomType;
}
cin.ignore(80, '\n');
cin.clear();
return roomType;
答案 0 :(得分:0)
*****再次编辑我的答案
我找到了解决方案,为什么它没有输出错误消息来输入换行符。显然,这一行:
cin.ignore(80, '\n');
是问题的根源。一方面,while循环中的条件表示您应该将换行符视为违规并打印错误消息。但是,另一方面,上面的行告诉编译器忽略换行符,甚至不检查它是否违反了while循环的条件。您必须删除此行,以便编译器甚至接受换行符以检查它是否违反条件,或用于任何其他目的。我已经更新了以下代码:
// Example program
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
cout << "Enter room type. (S)tandard or (P)remium: ";
char roomType;
roomType = _getch();
while (cin.fail() || (roomType != 's' && roomType != 'S' && roomType != 'p' && roomType != 'P') || (roomType == '\n'))
{
//cin.clear();
cout << "\nError. Enter room type again: ";
roomType = _getch();
cout << roomType;
}
//cin.clear();
cout << "\n\nSuccess" << endl;
return 0;
}
顺便说一句,我还注释掉了cin.clear()函数,因为虽然代码没有太大差别,但我不确定你是否需要在代码中包含那一行。我仍然坚持_getch()函数,因为cin无法捕获换行符(我尝试使用cin和_getch(),只有后者工作)
如果您想知道差异,_getch()被称为键盘记录器,只是因为它不是等待用户点击换行按钮,而是记录用户在键盘上点击的每一个键,它将它存储在变量中。结果,它能够捕获上面代码中的换行符。它是 文件的一部分。如果您想了解有关_getch()函数的更多信息,请访问此站点:
这应该适合你。如果它仍然不适合您,请在评论框中告知我。