[英]While loop with getline doesn't end for user input
我认为getline
在换行符处停止,但是 while 循环没有结束? 它返回正确的数据,但它只是位于终端 window 中。 例如:
Enter an expression: #5+4#5+4 (blinking cursor)
(可以永远输入数据,永远按回车不会退出)
我的代码,(main.cpp):
int main()
{
string exp;
cout << "Enter an Infix Expression:";
while (getline(cin, exp, '#'))
{
string token = exp;
string post;
cout << token << endl;
IntoPost *infix = new IntoPost(token.length());
post = infix->inToPost(token);
cout << post << endl;
}
cin.get();
}
您当前的程序无限循环,因为
getline
返回
std::basic_istream
,因此 while(getline()) 永远不会等同于“假”。
正如@0x499602D2 所说,您的程序正在按预期工作,但从 getline 的提取只能以两种方式结束,如参考此处所示:
从 is 中提取字符并将它们存储到 str 中,直到找到分隔符 delim(或换行符,'\n',如果没有指定分隔符)。
如果在 is 中到达文件末尾或在输入操作期间发生某些其他错误,提取也会停止。
第一个条件很难实现,因为控制台上的输入是由 \n 字符触发的。
至于第二个条件,根据@DavidC.Rankin:
您还可以使用 [Ctrl+d] 在 Linux 上生成手动 EOF,或者使用 [Ctrl+z] 在 windows 上生成手动 EOF(通常需要两次)
这意味着解决方案是使用 [Ctrl+d] 或 [Ctrl+z]触发第二个条件以随时结束您的 while 循环。
您可以尝试结束循环的另一种方法是中断“退出”字符串的输入:
(1)
#include <algorithm>
//...
while (getline(cin, exp, '#'))
{
// removes meaningless endline chars from input
exp.erase(std::remove(exp.begin(), exp.end(), '\n'), exp.end());
if (exp == "exit"){
break;
}
//... Your While Block Code Here!
}
要跳出你的while循环,你可以简单地使用:
出口#
# 注意,循环中endls
中的couts
将在下一个while (getline(cin, exp, '#'))
中渗入你的输入,给我们不需要的换行符。 为了防止这种情况,我们可以使用 std::erase() 去除输入中的结束线。 如果您希望在输入中保留这些结束行,只需设置string token = exp;
在 erase() 行前面。
没错,getline 会阻塞循环的执行,直到收到行分隔符并返回,而一切都很好,在下一步中,一切都将重复。 如果您希望循环不是无限的 - 然后将 Boolean 变量键放在循环条件中,并从输入中检查最后一个字符是否是退出符号,如果是则切换变量键
好吧,在循环中,您必须包含某种运算符。 现在您的代码如下:
while (getline(cin, exp, '#'))
{
//code
}`
问题在于它基本上是在说,
while(exp == true){
//Execute code forever
}
为了让你的循环停止,你必须传递某种参数。 例子:
while(getline(cin, exp, '#') == "What ever you want"){
//Exicute this code while exp is what I want
}
我希望你可以在你的项目中实现它,虽然我不知道你想要你的循环做什么,所以只要记住传递一个参数,让你的 while 循环在某个时候停止。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.