Программа завершается до ввода значения
Решаю такую задачу: Напишите программу, в которую сначала вводится набор пар, состоящих из имени и значения, например Joe 17 и Barbara 22. Для каждой пары занесите имя в вектор names, а число — в вектор scores (в соответствующие позиции, так что если names [7] =="Joe", то scores [7] ==17). Прекратите ввод, введя строку No more (т.е. следующая попытка ввести целое число завершится ошибкой). Убедитесь, что каждое имя уникально, и выведите сообщение об ошибке, если имя введено дважды. Выведите на печать все пары (имя, баллы) по одной в строке. Измените программу так чтобы при вводе имени она выводила количество баллов или сообщение "name not found".
вот мой код:
#include <iostream>
#include <vector>
#include <algorithm>
int main(int argc, char** argv) {
setlocale(LC_ALL, "Rus");
std::vector<std::string> names;
std::string name;
std::vector<int> scores;
int score;
bool first = true;
while (std::cin >> name >> score && name != "no more")
{
if (std::find(names.begin(), names.end(), name) == names.end())
{
names.push_back(name);
scores.push_back(score);
}
else
{
std::cout << "Имя введено дважды" << std::endl;
}
}
for (size_t i = 0; i < names.size(); i++)
{
std::cout << "name " << names[i] << " score " << scores[i] << std::endl;
}
std::string name2;
std::cin >> name2;
for (size_t i = 0; i < names.size(); i++)
{
if (names[i] == name2)
{
std::cout << scores[i] << std::endl;
}
else
{
std::cout << "name not found";
}
}
}
Проблема в том, что когда я заканчиваю вводить значения в вектор, программа выводит результат и останавливается, хотя там есть ещё одно приглашение на ввод. Объясните пожалуйста почему программа завершается. Так же не понятно почему
for (size_t i = 0; i < names.size(); i++)
{
if (names[i] == name2)
{
std::cout << scores[i] << std::endl;
}
else
{
std::cout << "name not found";
}
}
вот эта часть кода не работает по идеи в цикле если значение в векторе совпадает с значением переменной name2 то должно выводится количество очков, но всегда выводится "name not found"
Ответы (1 шт):
давайте посмотрим на вот эту конструкцию
while (std::cin >> name >> score && name != "no more")
Вы ожидаете, что в name будет "no more". Но вот беда - там будет только no. more пытаются прочитать в score, но это не получается (нельзя строку в число вставить). while завершается даже не проверив второе условие, ведь теперь std::cin >> name >> score == false. Когда будет читаться имя std::cin >> name2; то ничего не читается - ведь ввод находится в состоянии ошибки.
Как "пофиксить по быстрому"?
читайте второй раз вот так
std::cin.clear(); // почистим все ошибки, которые можно
std::cin.ignore(10000, '\n'); // и проигнорируем все до конца строки
// теперь строка будет читаться так, Вы ожидаете
std::string name2;
std::cin >> name2;
P.S. конструкция std::cin >> name читает слово до пробела (проигнорировав начальные пробелы). Хотя многие думают, что она читает несколько слов.