2017-11-27 22 views
2

getline()cinの後に使用する場合は、getline()を呼び出す前に、まずバッファ内の改行文字をフラッシュし、cin.ignore()を呼び出す必要があります。"cin"の後に "getline"を使用するときにcin.ignore()が必要なのはなぜですか? "cin"を複数回使用する場合は不要ですか?

std::string name, address; 

std::cin >> name; 
std::cin.ignore(); //flush newline character 
getline(std::cin,address); 

しかし、複数のcinを使用した場合、我々は、改行文字をフラッシュする必要はありません。

std::string firstname, lastname; 

std::cin >> firstname; 
std::cout << firstname << std::endl; 

//no need to flush newline character 

std::cin >> lastname; 
std::cout << lastname << std::endl; 

なぜですか?なぜ、最初のケースではcin.ignore()が必要ですが、最後のケースでは必要ではありませんか?

getline()

答えて

1

は、所与std::istreamから次の改行文字までを読み取るためながらstd::istream::operator>>()スキップ任意の空白(スペース、タブ、改行)。

したがって、整数または浮動小数点数を読み込むと、末尾のすべての空白が入力ストリームに残ります。コンソールや端末から読み込むと、データを入力してEnterキーを押します。Enterキーを押すとストリームに残りますが、クリアしないとgetline()がキャッチします。

次回にstd::stringを読み込んだときに、std::istream::operator>>()が空白をスキップするため、この情報を消去する必要はありません。


このコードセグメントを検討してください。

std::string a, b; 
std::cin >> a; 
std::getline(std::cin, b); 

と、この入力:

Stack Overflow<Enter> 
Where developers learn.<Enter> 

最初cin文はスペースとOverflow<Enter>の後ろを残して、単語Stackを読み込みます。そして、あなたがgetline()を呼び出す前にstd::cin.ignore()を挿入した場合、それは代わりに@Duthomhasはあなたがchar_を_includingによって何を意味明確にしてくださいでした

assert(b == "Where developers learn."); 
+0

に変わりますので

assert(b == " Overflow"); 

getlineで読み取ることでしょう? '>> '演算子もいくつかの文字をスキップできることを意味しますか? –

+0

@UzairZia '>'で文字を読むと、いくつかの設定を変更しない限り、空白をキャッチすることはできません。 – iBug

関連する問題