3

为了练习 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;
}
4

2 回答 2

4

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

cin.clear();

您还可以使用该rdstate()函数检查标准输入流的状态。任何其他0都意味着标准流处于错误状态。

于 2013-08-05T20:34:58.457 回答
0

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

std::cin.clear();

应该做的伎俩。这是我对此的看法

  • 正确的数据结构,而不是两个孤立的向量
  • 常量正确性
  • 分离函数
  • 不再.erase()有魔法索引的 hacky 调用
#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;
    }
}

如果您需要连续存储,请使用flat_mapboost 中的类似存储。

于 2013-08-05T20:49:48.653 回答