2016-03-26 7 views
0

私はC++プログラミングブックの練習をしています。名前の隣に名前とスコアを入力するプログラムを作成するように求めています。両方ともベクトルで保存されています。その後、私はそれらを入力し終わった後、それは私に名前を入力するように促すでしょう、そして、それはその名前に対応するスコアを見つけるでしょう。 e.x.私は "John"と入力します。これは、Johnのスコアをそのまま5に戻します。C++ cin >>再起動しない

ユーザーが名前とスコアを入力した後で、私のプログラムがユーザーに名前を入力して(対応するスコアを探す)、コードはcinコマンドをスキップするだけです。私のプログラムがうまくいかないように動く。私は、完全なプログラムを掲載します、私は必要な部分がで助ける:

cout << "Enter a name, which I will find the score for. \n"; 
string locateName; 
while(cin >> locateName) 
{ 

    for(int i = 0; i < names.size(); ++i) 
    { 
     if(locateName == names[i]) 
     { 
      cout << names[i] << "'s score is " << scores[i] << '\n'; 
     } 
     else { cout << "Name not found. \n"; } 
    } 

} 

具体的には、while(cin >> locateName)を:ここで

#include "std_lib_facilities.h" 

int main() 
{ 
vector<string>names; 
vector<int>scores; 
string name = ""; 
int score; 
while(cin >> name && cin >> score) 
{ 
     for(int i = 0; i < names.size(); ++i) // checks all previous words 
     { 
      if(name == names[i]) // if the name is used twice, exit 
      { 
       cout << "Error. Terminating...\n"; 
       exit(4); 
      } 
      else; 
     } 

     names.push_back(name); 
     scores.push_back(score); 
} 

cout << "Enter a name, which I will find the score for. \n"; 
string locateName; 
while(cin >> locateName) // i think the program won't accept the locateName 
{ 

    for(int i = 0; i < names.size(); ++i) 
    { 
     if(locateName == names[i]) 
     { 
      cout << names[i] << "'s score is " << scores[i] << '\n'; 
     } 
     else { cout << "Name not found. \n"; } 
    } 

} 
return 0; 
} 

が動作していない部分です。ここにいくつかの追加情報があります:名前(John 5 Bob 6 Pete 9)を入力するたびにCTRL + Zを入力し、を入力してを入力してcinを停止します。その後、プログラムは終了します。これは(ctrlZ)while(cin >> locateName)が新しい値を受け入れない原因になっていますか?助けていただきありがとうございます。

+0

ヒント/アイデア - 「名前が見つかりません」と何回言いますか?ちょうど1回、または2回?ループの各要素について、何かを出力しているからです。あなたの例を考えれば、Peteを探すと「Name not found。\ nName not found」と表示されます。 。\ nPeteのスコアは9です\ n ") –

+0

トピックの提案を外します:名前とスコアを2つのベクトルに分割しないで、両方を保存し、その構造の単一のベクトルを作る構造を作ります。 – user4581301

+0

@ user4581301この本の演習では、ベクトルを使用するように言われています。私たちはまだ勉強していません。 – jiggumbob

答えて

0

CTRL + Zは、ファイルの終わりのマーカーとして解釈されます。 cinにそのマーカーが表示されると、エラー状態になります(cin.eof()cin.fail()trueとなります。つまり、(bool)cinfalseになるため、最初のループが停止します)。エラー状態では、cinはこれ以上入力を受け付けません。

cinを良好な状態に戻すには、cin.clear()に電話することができます。良い状態に戻ったら、もう一度入力を受け入れます。

+0

ありがとう!私はcin.clear()について知らなかった – jiggumbob

関連する問題