2016-04-22 9 views
1

文字列として\ nを保存しないで、cin.ignore(200、 '\ n')を使用して行を入力して文字列に保存したいとします。私が行うときしかし:入力文字を無視する

cin.ignore(200,'\n'); 
getline(cin,name); 

それは二回入力何かに私を尋ねたが、私は一度だけ私に尋ねると、名前にそれを保存したいです。

私はcin.clear()について何かを読んだことがありますが、私はそれが私が必要としているものではないと思っています。

ありがとうございます!

+0

最初の入力を無視しているため、2回質問します。なぜ* ignore()* before * getline()*を使う必要がありますか? * getline()*は新しい行の文字を文字列に読み込まない。 –

答えて

2

cin.ignore(n, ch)破棄のいずれかn文字までstd::cinに関連付けられたストリームから文字はスキップされている、またはchまで見られています。 cin.ignore(200, '\n');は改行文字までの最初の入力を破棄しています。次に、2行目の入力を受け付ける行が表示されます。

あなたが行っていない場合は、あなたの場合は

int i = 0; 
std::cin >> i; // reads an integer, possibly leaving a '\n' in the stream 
std::cin.ignore(200, '\n'); // reads and discards until a newline is seen 
std::string name; 
std::getline(std::cin, name); // reads a full line 

のように、空白で区切られた入力操作を行うすぐ後にあなたが行を読みたい場合はcin.ignore(n, ch);構文を使用する必要があります空白で区切られた入力がある場合、cin.ignoreはライン入力を提供する最初の試みをスキップします。すぐにstd :: getlineを使うだけです。行末の改行文字は、ではなく、文字列にが追加されていますが、入力ストリームから削除されます。

documentation for std::getlineは、これを「注」で説明しています。以前の入力操作がストリームに改行文字(またはものは何でも使っている区切り文字)を左かどうか、あなたのような何かを行うことができることを確認することができない、より堅牢なライン入力機能については、


char ch; 
std::cin.peek(ch); 
if (ch == '\n') { 
    std::cin.ignore(1, '\n'); // or std::cin.get(ch); 
} 
std::string line; 
std::getline(std::cin, line); 

メンバー関数は、ストリームから削除することなく、読み込む次の文字を返します。改行であれば、先に進んで無視することができます。そうでなければ、getlineの呼び出しは、あなたがちょうど覗いた文字を含む行全体を読み込みます。

また、空白のみを使用する場合は、std::wsマニピュレータを使用できます。

+0

あなたはあなたの答えにタイプミスがあると思います。* "std :: readline" *、代わりに* std :: getline *と+1と言っていたと思います。 –

+0

@bkVnetありがとうございました。私は本当に 'std :: getline'を意味しました!それに応じて編集。 – Andrew

+0

@bkVnetだから...私は読書を続けたいと思ったら...?私のコードが次のようなものだと想像してください: すべてが宣言されています。 while(true){ getline(cin、name); cout << name << endl; } whileループの前にcin.ignore(100、 '\ n')があった場合は、最初に入力を求めていましたが、私はしたくないです... – magalenyo

0

この場合、ignore()を使用する必要はありません。 getline()は、改行文字を文字列に入れません。

ignore()機能があなたの最初の入力文字まで削除や改行(あなたdeliminator)までので、次のgetline()はおそらく尋ねるように読むことは何もありませんされているため、その入力をお願い理由は2倍になります最初の入力が200文字以上含まれていない限り、その場合はバッファ内の残りの文字が読み込まれます。

std::getline()は、デフォルトで改行文字で読み込まれた文字列に区切り文字を追加しません。

関連する問題