C ++,程序在允许输入之前结束

时间:2013-08-05 19:56:46

标签: c++

练习C ++我试图创建一个简单的程序,允许用户输入一个名称后跟一个分数,然后允许用户输入一个名称并获得输入名称的分数。程序工作正常,直到我输入转义字符(ctrl + z),输入转义字符后,程序将输出“输入学生姓名以查找分数”行但不允许用户输入名称,然后读出“按任意键退出”。我完全不知道如何解决这个问题,非常感谢任何帮助。

#include "stdafx.h"
#include <std_lib_facilities.h>

int main()
{
    vector <string>names;
    vector <int>scores;
    string n = " "; // name
    int s = 0; // score
    string student = " ";
    cout << "Enter the name followed by the score. (Ex. John 89)" << endl;
    while(cin >> n >> s)
    {
        for(size_t i = 0; i < names.size(); ++i)
        {
            if(n == names[i])
            {
                cout << "Error: Duplicate name, Overwriting" << endl;
                names.erase(names.begin() + i);
                scores.erase(scores.begin() + i);
            }
        }
        names.push_back(n);
        scores.push_back(s);
    }
    cout << "Name: Score:" << endl;
    for(size_t j = 0; j < names.size(); ++j)
    {
        cout << names[j];
        cout <<" " << scores[j] << endl;
    }
    cout << "Enter name of student to look up their score" << endl;
    cin >> student;
    for(size_t g = 0; g < names.size(); ++g)
    {
        if(student == names[g])
        {
            cout << "Score: " << scores[g] << endl;
        }
    }
    keep_window_open();
    return 0;
}

2 个答案:

答案 0 :(得分:4)

按CTRL + Z键组合后,会导致cin流的EOF状态,您需要将cin输入流恢复到正常的“良好”状态才能够再次使用它。 在for循环后添加以下代码,您可以在其中打印向量的内容。

cin.clear();

您还可以使用rdstate()功能检查标准输入流的状态。除0以外的任何内容都意味着标准流处于错误状态。

答案 1 :(得分:0)

如前所述,您需要在读取记录失败后清除std::cin上的错误状态。

std::cin.clear();

应该做的伎俩。以下是我对

的看法
  • 正确的数据结构而不是两个孤立的向量
  • const correctness
  • 分离职能
  • 不再使用魔法索引进行hacky .erase()调用
#include <map>
#include <iostream>

std::map<std::string, int> read_records()
{
    std::map<std::string, int> records;

    std::string name;
    int score;
    std::cout << "Enter the name followed by the score. (Ex. John 89)" << std::endl;
    while(std::cin >> name >> score)
    {
        if (records.find(name) != end(records))
        {
            std::cout << "Error: Duplicate name, Overwriting" << std::endl;
        } else
        {
            records.insert({name, score});
        }
    }
    std::cin.clear();

    return records;
}

int main()
{
    auto const records = read_records();

    std::cout << "Name\tScore:" << std::endl;
    for(auto& r : records)
        std::cout << r.first << "\t" << r.second << std::endl;

    std::cout << "Enter name of student to look up their score: " << std::flush;
    std::string name;
    if (std::cin >> name)
    {
        std::cout << "\nScore: " << records.at(name) << std::endl;
    }
}

如果您需要连续存储,请使用类似于boost中的flat_map