我希望我的程序能够识别用户何时按下“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;
}
答案 0 :(得分:1)
在前两种情况下,如果您尝试检测输入按下,则使用getline
进行输入会有两个问题(尽管您真正检测到的是换行符,并且按下输入不是唯一可以生成的方式,尽管它通常是最直接的方式。首先,正如你所说的那样,无论getline
使用什么作为分隔符,它都会从它所读取的输入中省略,所以你真的无法使用它来获得包含的换行符,而不会让事情变得更多复杂。其次,在换行前输入的任何字符也会包含在检索到的行getline
中,因此只需与字符串"\n"
进行比较,就不会告诉您是否读取了换行符是getline
保持分隔符,它没有。
另一个问题当然是,理想情况下,您需要检查以确保输入流cin
在读取时不会处于错误状态。如果不是这种情况,getline
只应在输入中收到换行符后才能继续。
原则上这表明(如果你不注意提供新行作为输入按键的非输入键方式),如果你执行了正确的错误检查,你就不需要检查字符串本身完全知道输入键被按下 - 如果getline
停止输入阻止并且没有遇到错误(我在&#34; m包括&#34;错误& #34;这里是在流状态标志中)它读取分隔符,在你的情况下是分界符。因此,您可以利用getline(cin, enter)
的阻止行为来指导您的控制流,但是为了退出循环,您仍然需要检查是否输入了除换行之外的其他内容(或者是否为文件末尾)输入或发生错误,通过检查cin
)上的状态标志。
使用您在第三种情况下使用的cin.get()
方法,实际上可以检索换行符,与getline
不同 - 尽管您提供的代码每次循环迭代需要两次输入按下在第一个之后,而不是一个(我怀疑是你的意图)。单独的条件break
情况不一定是必要的,并且循环条件应该足够(在失败的情况下,no-args std::istream::get()
返回EOF
值,其赢得&#39}。 t等于\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键的行为,而不是需要按两次。
你还有一些尴尬的语法&#34;输入其他字符然后进入退出&#34;,但这部分是由于行缓冲输入的限制(例如典型的命令行终端)。通过上面的循环,您也可以通过输入平台的文件结束键组合(不同但在基于UNIX的系统上通常是CTRL+D
)立即退出(不按Enter键),但是如果你想在命令行环境中向一般的交互式键盘输入(通过按键而不是输入逐行文本直接发生事情)进一步发展,这可能比这更复杂该程序的范围似乎并且通常需要外部库和/或特定于平台的支持。如果你想深入研究C ++,你可能会看一下this question的一些答案。
换句话说,检测交互式命令行程序的按键通常比cin.get()
有更好的选项,但是如果你想要检测除了输入之外的按键,它们会变得更加复杂并立即响应(而不是等待另一个输入)。在基本的,与平台无关的C ++中,除cin.get()
和getline()
之外还有其他输入处理选项,但据我所知,它们都会遇到这类问题 - 事实输入到cin
的输入在输入流上不可用,直到行结束 - 无需进入特定于平台的代码(或包含特定于平台的代码的外部库)来更改该事实或否则解决它。