2017-09-27 23 views
0

私はC++の初心者で、現在ベクトルを学習しています。ここでは、プログラムがユーザーの入力やベクトルに格納を取得し、各要素から格納された値を印刷するために進んで簡単なコードです:C++はユーザー入力から文字列をベクトルに格納します

int main(){ 
vector<string> myVector; 
string myInput; 
int n; 
cin>>n; 
cin.ignore(numeric_limits<streamsize>::max(),'\n'); 
for(int i = 1; i <= n;i++){ 
    cout<<"loop count: "<<i<<endl; //added for checking the current loop 
    getline(cin, myInput); 
    cin.ignore(numeric_limits<streamsize>::max(),'\n'); 
    myVector.push_back(myInput); 
    } 
for(unsigned int j = 0;j < myVector.size(); j++){ 
cout<<myVector[j]<<endl; 
} 
return 0; 
} 

は、私は、ユーザの文字列入力中に、自分のコードを実行すると、それはすることができます私は最終的に次のループに行く前に2つの文字列を入力します。プログラムは各ループに対して最初に入力された文字列を出力します。だから私の質問は:

1)これの背後にある理由は何ですか?なぜ次のループに行く前に2つの文字列を入力する必要がありますか?誰かが私に説明することはできますか?

2)これはどのように修正できますか?

編集:ここに私のサンプル入力と出力は、次のとおりです。

入力:

3 
input loop count: 1 
we are 
the champions 
input loop count: 2 
no time 
for losers 
input loop count: 3 
we are 
the champions 

出力:

we are 
no time 
we are 
+0

あなたの問題については、あなたがプログラムに与えた入力と、実際の出力と期待される出力を教えてください。しばらく時間を取って[良い質問をする方法を読む](http://stackoverflow.com/help/how-to-ask)を参照してください。 –

+1

'getline'はスペースを含めて一行全体を取得します。スペースは、文字列内にある完全に有効な文字です... – doctorlove

答えて

2

問題はループ内のignoreコールです。

std::getlineは黙って改行を食べるようになるが、あなたは、あなたが満足するignoreため行を入力する必要がありますignore呼んでいるので。

ループからignoreコールを削除するだけで、期待通りに機能するはずです。

+0

ありがとう!それは実際にそれを修正しました。また、なぜそれが起こるのか説明してくれてありがとう –

0

あなたは)(cin.clearを入れてみてくださいでした。 cin.sync(); getline関数の前に? cinとgetlineを同時に使用すると問題が発生します。