簡體   English   中英

帶有 getline 的循環不會因用戶輸入而結束

[英]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();
    }

使用 EOF 的解決方案

您當前的程序無限循環,因為 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 循環。


使用 Break 語句的替代方法

您可以嘗試結束循環的另一種方法是中斷“退出”字符串的輸入:

(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM