识别"Enter"

Identify "Enter"

本文关键字:Enter 识别      更新时间:2023-10-16

我希望我的程序能够识别用户何时按下"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停止阻塞输入,没有遇到一个错误(我包括文件尾在"错误"的流国旗)读分隔符,这对于您来说是换行符。因此,您可以利用getline(cin, enter)的阻塞行为来指导控制流,尽管要退出循环,您仍然需要检查是否输入了除换行符之外的其他内容(或者是否输入了文件结束符或发生了错误,通过检查cin上的状态标志)。

<标题> std:: istream:: ()

使用您在第三种情况中使用的cin.get()方法,您实际上可以检索换行符,与getline不同-尽管您提供的代码在第一次循环迭代之后需要两次回车键,而不是一次(我怀疑这是您的意图)。单独的条件break不应该是必要的,循环条件应该足够了(在失败的情况下,no-args std::istream::get()返回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;
}

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

仍然使用"输入其他字符然后输入退出"这种有点尴尬的语法,但这在一定程度上是由于行缓冲输入的限制(例如典型的命令行终端)。使用上述循环,您也可以通过输入平台的文件结束键组合(不同,但在基于unix的系统上通常是CTRL+D)立即退出(不按回车键),但如果您想在命令行环境中进一步发展到一般的交互式键盘输入(通过按键直接发生事情,而不是输入一行一行的文本),这可能比程序的范围看起来要复杂得多,通常需要外部库和/或特定于平台的支持。如果你想深入研究c++,你可以看看这个问题的一些答案。

换句话说,对于交互式命令行程序来说,通常有比cin.get()更好的检测按键的选项,但是如果您想检测除enter以外的按键并立即响应(而不是等待另一个enter),它们可能会变得更加复杂。还有其他input-handling选项除了cin.get()getline()基本可用,独立于平台的C + +,但是据我所知他们都是会遇到这样的问题——这一事实cin没有可用的输入的输入流到最后一行——没有进入特定于平台的代码(或外部库包含特定于平台的代码)来改变这一事实或者工作。