2016-03-26 3 views
0

Итак, я делаю упражнение для книги программирования на С ++, и он просит меня создать программу, в которую я вводим имена и оценки рядом с этими именами, и они оба сохраняются в векторах , Затем, после того как я закончу ввод, я попрошу ввести имя, после чего он найдет соответствующий балл для этого имени. e.x. Я набираю «Джон», он возвращает 5, если это то, что я ставлю на счет Джона.C++ cin >> не начинается снова

Проблема, с которой я столкнулся, заключается в том, что после того, как пользователь выполнил ввод имен и оценок, моя программа предложит пользователю ввести имя (чтобы найти соответствующий балл), код просто пропускает команду cin и движется дальше, что делает мою программу неработоспособной. Я буду размещать полную программу, то часть мне нужна помощь с:

#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; 
} 

Вот та часть, которая не работает:

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). Вот некоторая дополнительная информация: всякий раз, когда я ввожу имена (John 5 Bob 6 Pete 9), я нажимаю CTRL + Z, затем ENTER, чтобы остановить cin. Затем программа заканчивается. Это (ctrlZ), что заставляет while(cin >> locateName) не принимать новые значения? Спасибо, спасибо.

+0

Вот подсказка/идея - сколько раз она говорит «Имя не найдено»? Только один или два раза? (Я спрашиваю об этом, потому что, когда вы просматриваете цикл, для каждого элемента цикла вы будете выводить что-то. Учитывая ваш пример, если вы ищете Пит, вы получите: «Имя не найдено. \ NName не найдено . \ nПет рейтинг 9 \ n ") –

+0

Предложение без темы: не разбить имена и баллы на два вектора, создать структуру, в которой хранятся оба и сделать один вектор этой структуры. – user4581301

+0

@ user4581301 В упражнении книги сказано использовать векторы. Мы еще не изучили данные. – jiggumbob

ответ

0

CTRL + Z интерпретируется как маркер конца файла. Как только cin видит этот маркер, он переходит в состояние ошибки (cin.eof() и cin.fail() будет true, что означает (bool)cin будет false, вот почему ваш первый цикл останавливается). Пока в состоянии ошибки, cin больше не будет принимать входные данные.

Чтобы получить cin обратно в хорошее состояние, вы можете позвонить по телефону cin.clear(). Когда он вернется в хорошем состоянии, он снова примет вход.

+0

Спасибо! Я не знал о cin.clear() – jiggumbob