我希望我的程序能够识别用户何时按下“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')
phá vỡ;
}
cout << "Thank you for playing"<< endl;
trả về 0;
}
std::getline
在前两种情况下,如果您尝试检测Enter键,则使用getline
作为输入有两个问题(尽管您真正检测到的是换行符,而按enter键不是唯一的方法生成,尽管通常是最简单的)。首先,正如您所说,无论getline
用作定界符,它都将忽略读取的输入内容,因此,在没有使事情变得更加复杂的情况下,您实际上将无法获得包括在内的换行符。其次,但是,在换行符之前输入的所有字符也将包含在检索到的getline
行中,因此仅与字符串"\n"
进行比较就不会告诉您是否已读取换行符,即使getline
保留分隔符也是如此没错
当然,另一个问题是,理想情况下,您需要检查以确保输入流cin
在读取时不处于错误状态。如果不是这种情况,则getline
仅在收到输入中的换行符后才能继续。
原则上,这表明(假设您不介意以换行符作为输入输入的非输入键的方式用作输入键),如果您执行正确的错误检查,则完全不需要检查字符串本身就知道按下回车键-如果getline
停止阻止输入,并且没有遇到错误(我在流错误状态标志中包括“错误”中的文件结尾),它将读取定界符,您的情况是换行符。因此,您可以利用getline(cin, enter)
的阻止行为来控制流程,尽管要退出循环,您仍然需要检查是否输入了换行符(或者是否输入了文件结尾或是否发生了错误) ,方法是检查cin
上的状态标志)。
std::istream::get()
Vàcin.get()
不同,使用您在第三种情况下使用的getline
方法,您实际上可以检索换行符-尽管您提供的代码在第一次循环后每次循环需要两次回车,而不是一次(我怀疑这是您的意图)。不需要单独的条件break
情况,循环条件就足够了(在失败情况下,no-args std::istream::get()
trở lạiEOF
值,该值不等于\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++的知识,则可以看看
câu hỏi này的一些答案。
换句话说,检测交互式命令行程序的按键通常比
cin.get()
有更好的选择,但是如果您要检测输入以外的其他按键并立即做出响应,它们可能会变得更加复杂(如果您想检测按键的输入而不是立即输入)等待另一个进入)。在基本的,与平台无关的C++中,除了
cin.get()
Và
getline()
之外,还有其他输入处理选项,但是据我所知,它们都会遇到这种问题-
cin
的输入不会变成事实在输入流中直到行尾都可用-无需进入特定于平台的代码(或包含特定于平台的代码的外部库)来更改该事实或以其他方式解决该问题。
Tôi là một lập trình viên xuất sắc, rất giỏi!