输入char时忽略输入键

时间:2017-01-19 00:27:07

标签: c++ validation

我试图验证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;

1 个答案:

答案 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()函数的更多信息,请访问此站点:

_getch, _getche

这应该适合你。如果它仍然不适合您,请在评论框中告知我。