[英]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.