识别 "Enter"

Identify "Enter"

我希望我的程序能够识别用户何时按下 "enter" 并继续循环。但是我不知道如何让程序识别"enter"。尝试了两种方式:

string enter;
string ent = "\n";
dice d1;

cout << "To start - Press enter" << endl;
getline (cin, enter);

while (enter == ent)
{
    d1.throw_dice();
    d1.draw_dice();
    cout << "Try again, press enter" << endl;
    getline (cin, enter);
}

cout << "Thank you for playing"<< endl;

还有这个:

string enter;
dice d1;

cout << "To start - Press any key and enter" << endl;
getline (cin, enter);

while (enter == "\n")
{
    d1.throw_dice();
    d1.draw_dice();
    cout << "Try again, press enter" << endl;
    getline (cin, enter);
}

cout << "Thank you for playing"<< endl;

我知道该字符串会丢弃“\n”,但无法真正找到解决它的方法。

PS:

我找到了解决办法。 但我还是觉得应该有更好的选择。

        while (cin.get() == '\n')
    {
        d1.throw_dice();
        d1.draw_dice();
        cout << "Try again, press enter! Or press any other key and enter" << endl;
        if (cin.get() != '\n')
            break;
    }

    cout << "Thank you for playing"<< endl;

    return 0;
}

std::getline

在前两种情况下,如果您尝试检测回车键(尽管您真正检测到的是换行符和回车键),使用 getline 作为输入有两个问题不是可以生成的唯一方法,尽管它通常是最直接的)。首先,正如您所说,无论 getline 用作定界符,它都会从它读取的输入中删除,因此您将无法真正使用它来包含换行符,而不会使事情变得更复杂一些。其次,在换行符之前输入的任何字符也将包含在检索到的 getline 行中,因此简单地与字符串 "\n" 进行比较不会告诉您是否读取了换行符 getline 保留分隔符,但它没有。

当然,另一个问题是,理想情况下,您希望检查以确保在读取输入流时 cin 没有处于错误状态。如果不是这种情况,getline 应该只在收到输入中的换行符后才继续。

原则上这表明(假设您不介意 non-enter-key 提供换行符作为输入的方式被视为输入键按下)如果您执行适当的错误检查,则不需要检查字符串本身完全知道按下回车键 - 如果 getline 停止阻止输入并且没有遇到错误(我在 "error" 中包含 end-of-file 就像在流状态标志)它读取定界符,在您的情况下是换行符。因此,您可以利用 getline(cin, enter) 的阻塞行为来引导您的控制流,但要退出循环,您仍然需要检查是否输入了换行符以外的内容(或者是否输入了 end-of-file或发生错误,通过检查 cin) 上的状态标志。

std::istream::get()

使用您在第三种情况下使用的 cin.get() 方法,您实际上可以检索换行符,这与 getline 不同 - 尽管您提供的代码每次循环迭代需要两次输入在第一个之后,而不是一个(我怀疑这是你的意图)。单独的条件 break 情况应该不是必需的,循环条件应该足够了(在失败情况下 no-args std::istream::get() returns EOF 值,这不会等于 \n 所以你的循环在这种情况下退出)。也就是说,

while (cin.get() == '\n') {
    d1.throw_dice();
    d1.draw_dice();
    cout << "Try again, press enter! Or press any other key and enter" << endl;
}

应该提供在一个循环迭代后直接进入下一个循环迭代后按回车键的行为,而不是需要按两次。

您仍然使用 "enter some other character then enter to exit" 有点笨拙的语法,但这部分是由于 line-buffered 输入的限制(例如典型的 command-line 终端) .使用上述循环,您还可以通过输入平台的 end-of-file 组合键(有所不同,但在 UNIX-based 系统上通常是 CTRL+D)来立即退出(无需按回车键),但是如果您想要在 command-line 环境中朝着通用交互式键盘输入(通过按键直接发生事情而不是输入 line-by-line 文本)取得比这更进一步的进展,这可能比该程序的范围似乎是并且通常需要外部库 and/or platform-specific 支持。如果你确实想深入研究 C++,你可以看看 this question 的一些答案。

换句话说,对于交互式 command-line 程序,通常有比 cin.get() 更好的检测按键的选项,但如果您想检测按下enter 以外的键并立即响应(而不是等待另一个 enter)。除了 cin.get()getline() 之外,还有其他 input-handling 选项在基本 platform-independent C++ 中可用,但据我所知,它们都将 运行进入此类问题 - 事实上 cin 的输入在行尾之前在输入流上不可用 - 无需进入 platform-specific 代码(或包含 platform-specific 代码)来改变这个事实或以其他方式解决它。