цикл ввода c ++, за которым следует другой ввод - PullRequest
0 голосов
/ 25 июня 2018

c ++ Microsoft Visual Studio для Windows.

Я очень плохо знаком с кодированием.в настоящее время изучаю программирование - принципы и практика использования C ++ от Stroupstrup, и я столкнулся с трудностью.Я должен создать «таблицу показателей» с векторным именем и векторной оценкой из пользовательского ввода.Я использовал цикл for, чтобы получить ввод.теперь я должен изменить программу так, чтобы с помощью 2-го ввода от пользователя я мог искать в списке и "cout <<" счет для человека.проблема в том, что программа полностью игнорирует вторую команду "cin >>".Я ищу в Интернете и не могу найти разумный ответ на эту проблему.Существует ли какое-либо специальное взаимодействие между завершаемым входом цикла for и другим синтаксисом ввода (не зацикленным):

  #include "stdafx.h"
#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main()
{
vector<string> name;
vector<int> score;
string temp2;
int i;
for (string temp; cin >> temp >> i;) //input terminated with "Ctrl+Z"
    name.push_back(temp), score.push_back(i);
for (int i = 0; i < name.size(); ++i) {
    for (int j = i + 1; j < name.size(); ++j) {
        if (name[i] == name[j]) {
            name[j] = "error";
            score[j] = 0;
        }
    }
}
for (int i = 0; i < name.size(); ++i) {
    cout << name[i] << "------" << score[i] << "\n";
}
cout << "name"; //this line shows in the console
cin >> temp2; //but I cannot prompt the user to input again?
return 0;
}

1 Ответ

0 голосов
/ 25 июня 2018

CTRL-Z интерпретируется как «конец файла», так что любой последующий доступ к этому потоку больше не будет считываться в элементах. Единственный безопасный способ - это изменить логику программы так, чтобы список имен заканчивался, скажем, «END», а не CTRL-Z. Затем вы можете продолжить в режиме сохранения.

Часто входные данные с терминала считываются построчно и затем анализируются. Это облегчает обработку ошибок. Смотрите следующий код, следующий за таким подходом:

#include <sstream>

int main() {

    string line;
    map<string,int> scoreboard;
    cout << "enter name score (type END to finish):" << endl;

    while (std::getline(cin, line) && line != "END") {
        stringstream ss(line);
        string name;
        int score;
        if (ss >> name >> score) {
            scoreboard[name] = score;
        } else {
            cout << "invalid input. Type END to finish" << endl;
        }
    }

    cout << "enter name:" << endl;
    string name;
    if (cin >> name) {
        auto item = scoreboard.find(name);
        if (item != scoreboard.end()){
            cout << "score of " << name << ":" << item->second << endl;
        }
        else {
            cout << "no entry for " << name << "." << endl;
        }
    }


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...