C++ 而与getline的循环不';t端用于用户输入

C++ 而与getline的循环不';t端用于用户输入,c++,C++,我以为getline会在换行符处停止,但是while循环不会结束?它返回正确的数据,但它只是位于终端窗口中。例如: (可以永久输入数据并按enter键,但不会退出) 我的代码(main.cpp): intmain() { 字符串表达式; cout没错,getline会阻止循环的执行,直到收到一个行分隔符并返回,而在下一步中,一切都会重复。如果希望循环不是无限的,则将布尔变量键置于循环条件中,并从输入检查最后一个字符是否是退出符号,如果是的话使用EOF切换变量键解决方案 您当前的程序正在无休止地循

我以为
getline
会在换行符处停止,但是while循环不会结束?它返回正确的数据,但它只是位于终端窗口中。例如:

(可以永久输入数据并按enter键,但不会退出)

我的代码(main.cpp):

intmain()
{
字符串表达式;

cout没错,getline会阻止循环的执行,直到收到一个行分隔符并返回,而在下一步中,一切都会重复。如果希望循环不是无限的,则将布尔变量键置于循环条件中,并从输入检查最后一个字符是否是退出符号,如果是的话使用EOF切换变量键

解决方案 您当前的程序正在无休止地循环,因为
getline
返回
std::basic\u istream
,所以while(getline())永远不会等于“false”

正如@0x499602D2所述,您的程序正在按预期工作,但从getline提取只能以两种方式结束,如引用所示:

从is中提取字符并将其存储到str中,直到找到分隔符delim(或换行符'\n',表示未指定分隔符)

如果在is中到达文件末尾或在输入操作期间发生其他错误,提取也会停止

第一个条件很难实现,因为控制台上的输入由\n字符触发

对于第二个条件,根据@DavidC.Rankin:


您还可以在Linux上使用[Ctrl+d]或windows上使用[Ctrl+z]生成手动EOF(通常需要两次)

这意味着解决方案是使用[Ctrl+d]或[Ctrl+z]随时触发第二个条件以结束while循环


使用Break语句的替代方法 您可以尝试结束循环的另一种方法是在输入“exit”字符串时中断:

(一)

#包括
//...
while(getline(cin,exp,“#”))
{
//从输入中删除无意义的结束行字符
exp.erase(std::remove(exp.begin()、exp.end()、'\n')、exp.end());
如果(exp==“退出”){
打破
}
//…您的While块代码在这里!
}
要打破while循环,您只需使用:

出口#


#注意,循环中的
couts
中的
结束符将在下一次
while(getline(cin,exp,“#”)
时流入您的输入,给我们带来不需要的换行符。为了防止这种情况,我们可以使用std::erase()从输入中删除结束符。如果希望在输入中保留这些端点,只需在erase()前面设置
string token=exp;
行。

您如何看待循环结束?您认为什么条件会使
getline
返回转换为
false
的内容?我认为newline方法在到达后会终止\n?我没有询问方法是否终止,因为它必须终止才能返回值。我询问了返回的值当该方法终止时,通过一个方法。您的程序没有问题,只是您的控制台是以行分隔的,这意味着您必须输入一个新行字符才能继续程序。您还可以在Linux上使用
[Ctrl+d]
或windows上使用
[Ctrl+z]
生成手动
EOF
(通常需要两次)@你完全正确,我不敢相信我完全忘记了这么做。我认为你的评论本身应该是问题的答案,因为它允许代码在不做任何更改的情况下解析。
Enter an expression: #5+4#5+4
(blinking cursor) 
    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();
    }
#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!
    }