2016-05-06 3 views
-2

さて、私はcinを使用して、複数の文字列を読み取ることができないことを知っています。しかし、このプログラムでのgetlineの動作は理解できません。私はそれに問題が何かを把握することができません。私は一緒にcinとgetlineを使用することはできませんか?で、テンプレート引数でC++でのgetlineの動作はどうですか?

template <class CharT, class Traits, class Allocator> 
std::basic_istream<CharT, Traits>& operator>>(
     std::basic_istream<CharT, Traits>& is, 
     std::basic_string<CharT, Traits, Allocator>& str); 

CharT = charおよびドキュメントを1としてTraits = std::char_traits<CharT>>

operator<<,>>(std::basic_string)

#include <iostream> 
#include <string> 

int main() 
{ 
    std::string name; 
    std::cout << "What is your name? "; 
    std::cin>>name; 
    std::cout << "Hello, " << name << "!"<<std::endl; 
    getline (std::cin, name); 
    std::cout << "Hello, " << name << "!\n"; 
} 

Input : 
Jai Simha Verma 
Jai Simha Verma 

OUTPUT: 
What is your name? Hello, Jai! 
Hello, Simha Verma ! 
+0

何が奇妙ですか?正確に何をしたいですか? –

+0

@Issacはこの動作を非常にうまく説明しています。それは期待された動作ですが、あなたのコードが "getline"コールで次の行を読むことを期待しているなら、 "cin.ignore(streamsize、delim)"を使って現在の行をスキップすることができます。 http://www.cplusplus.com/reference/istream/istream/ignore/ – Rana

答えて

2

コードstd::cin>>name;operator>>(std::cin, name);と同等ですが、これは(<string>で宣言された)関数を呼び出します これは最初に空白を整理し、最初の空白文字(ストリームからは抽出されませんが)見つけられます。 このように、 'Jai Simha Verma \ n'はストリームの(未読の)内容ですが、 'Jai'のみを読み込みます。お電話getline (std::cin, name);ストリームが含まれていますで

「Simhaバーマ\ nJai Simhaバーマ\をn」は、それがnameを設定しますので、最初の改行文字(それはそれを抽出しますが、nameに追加しません)で読んgetline();停止します「Simha Verma」(先頭のスペースを含む)へ。

この後、std::cinの(未読)内容は 'Jai Simha Verma \ n'になります。

どのような動作が望ましいかわからないので、これを達成する方法を提案することができず、むしろ何が起こっているのかを説明しただけです。

関連する問題