2016-07-18 104 views
0

我試圖讓(在C++中)從我想存儲以備後用的鍵盤輸入一些輸入。這只是我工作的代碼的簡化版本,但它再現相同的行爲:爲什麼getline(...)在屏幕上打印?

#include <iostream> 

int main(int argc, char * * argv) 
{ 
    std::string line; 

    std::cout << "> "; 
    std::getline(std::cin, line); 

    return 0; 
} 

getline正確讀取從標準輸入,但輸入後得到立即打印上新的生產線。此外,>字符後面的空格在讀取我的輸入時被忽略,但在後面打印。例如:

>hi 
> hi 

爲什麼會發生這種情況?我怎樣才能避免它?

我在Windows 10上使用CLion 2016.1(這發生在CLion的控制檯上)。

+0

你使用什麼編譯器?你是否正在運行編譯器的代碼? – NathanOliver

+0

您可能需要刷新輸出以確保它在您希望顯示時出現,否則打印時間是實施定義的。 –

+0

[Can not](http://coliru.stacked-crooked.com/a/9c803cd4281ed0c9)[reproduce](http://ideone.com/7XV0UM)[this](http://imgur.com/AvAyaUB)[行爲(http://imgur.com/2BjuFCc)。 –

回答

2

如果在內置控制檯中運行,Clion會這樣做,但是如果在Windows控制檯中運行,它不應該發生。

我該如何避免它?

最簡單的方法是在調試模式下運行它。

1

爲什麼會發生這種情況?

可能是因爲輸出的緩衝。

我該如何避免它?

通過具有什麼應該被印刷用std::cout << "> " << std::flush;代替std::cout << "> ";調用getline()之前進行打印。

+1

這裏不需要刷新標準輸出。從std :: cin讀取標準輸出,以便在等待輸入前顯示提示。 –

0

爲什麼不使用std :: cin?奇怪的行爲可能是因爲你的平臺。

您有一個std::cout後跟getline()函數。根據您使用的編譯器,getline中的一些行爲可能會稍有不同。有些可能無法重現您的行爲。

本質上,在傳統的C++風格的鍵盤I/O中,大多數人在大多數輸入或輸出後使用std::endl的調用。 endl其中有一個自動調用flush()以刷新標準緩衝區。但是,getline()函數是來自C語言的保留。在C中,通常必須重複使用flush()命令才能獲得所需的輸出。這是爲什麼最好儘可能堅持C風格輸出或C++風格輸出的原因之一。

爲什麼不能使用std::cin?你可以用endl來跟上這一點,之後所有事情都應該表現得很好。

或者,你可以逃脫只是調用赤裸的endlflush(),讓事情回到定義的行爲土地。

您是否有理由特別需要getline()