10

コードは次のとおりです。

string str;
cin>>str;
cout<<"first input:"<<str<<endl;
getline(cin, str);
cout<<"line input:"<<str<<endl;

その結果、getline はユーザー入力のために一時停止しないため、2 番目の出力は常に空になります。

しばらく時間を費やした後、最初の呼び出し「cin>>str」の後、「\ n」がまだcinに保存されているようで(cin.peek()を使用して確認)、getlineがすぐに終了することに気付きました。解決策は、最初の使用と 2 番目の使用の間にもう 1 行追加することです。 cin.ignore(numeric_limits::max(), '\n');

ただし、最初の呼び出しの後に '\n' が残っているのはなぜですか? istream& operator>> は実際に何をしますか?

4

6 に答える 6

7

は、 に対して定義され\nている方法に従って、入力ストリームに残されます。は、空白文字 (この場合は ) が見つかるまで、入力ストリームからの文字で埋められます。この時点で、空白文字は入力ストリームの次の文字になります。operator>>std::stringstd::string\n

の直後に\nを呼び出して を削除することもできます。ただし、この特定の I/O キャットの皮を剥ぐには、非常に多くの方法があります。(おそらく、それ自体が良い質問でしょうか?)cin.get()cin>>str

于 2010-03-26T17:34:19.890 に答える
2

他の人が言っているように、問題は改行が最初の抽出から残っていることです。私が行う解決策の1つは、ストリーム内の残りの文字をすべて破棄することです。

std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
于 2010-03-26T17:41:31.497 に答える
2

通常、std::cin からの行指向の入力のみを行うことをお勧めします。したがって、コードは次のようになります。

string str;
int val;
// Read an entire line and parse an integer from it
{
    string line;
    getline(cin, line);
    istringstream iss(line);
    iss >> val;
}
cout<<"first input:"<<val<<endl;
getline(cin, str);
cout<<"line input:"<<str<<endl;

エラーチェックも必ず追加してください。

getline のみのアプローチでは、入力のライン バッファリングや入力のクリアなどについて考える必要がなくなります。 >> で何かを直接読み取る場合、ユーザーが必要なものを入力する代わりに Enter キーを押しても、入力は終了しませんが、代わりに、トークンが入力されるまで続行します (通常、この動作は望ましくありません)。

于 2010-03-26T17:58:10.647 に答える
2

デフォルトでは、ストリーム挿入演算子は空白が見つかるまで読み取ります。スペース、タブ、改行などが表示されるまで、最初の呼び出しは返されません。次に、次の文字に到達できるように、次の文字を消費する必要があります。

于 2010-03-26T17:34:05.290 に答える
0

主に入力タイプの動作とそれらを混合しているために、この問題が発生する理由のいくつかを説明する優れた記事

于 2010-03-26T17:38:54.467 に答える