【问题标题】:Ignore enter key when inputting char输入字符时忽略回车键
【发布时间】:2017-06-03 13:29:43
【问题描述】:

我正在尝试验证 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;

【问题讨论】:

  • 我在@KeeganHeffernan 下面更新了我的答案。请检查它是否适合您(它适合我)。

标签: c++ validation


【解决方案1】:

***** 再次编辑我的答案

我找到了为什么它没有输出输入换行符的错误消息的解决方案。显然,这一行:

    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

这应该对你有用。如果它仍然不适合您,请在 cmets 框中告诉我。

【讨论】:

  • 当您可以使用更容易理解的'\n' 时,为什么还要打一个10?它会让你免于解释。
  • 感谢您的回答。不是 roomtype == 10 吗?因为它相等会触发验证?编辑:测试两者,控制台仍然输出空行而不是错误消息。
  • 你说得对,@KeeganHeffernan,当我发布我的第一个解决方案时,这就是我的想法。但是,它们的含义相同,因为 10 是 ascii 表中 '\n' 的 ascii 值。所以在这种情况下它们可以互换使用。
  • @NewbietoProgramming 我已经尝试了这两种解决方案,但我仍然以空行结束。
  • 如果您按两次 Enter 按钮,它会输出无效消息并继续要求再次输入,@KeeganHeffernan。另外,你用我上面更新的代码试过了吗?
猜你喜欢
  • 2013-01-18
  • 1970-01-01
  • 2014-07-10
  • 2020-11-27
  • 1970-01-01
  • 2015-12-15
  • 2011-04-24
  • 1970-01-01
  • 2013-07-26
相关资源
最近更新 更多