练习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;
}
答案 0 :(得分:4)
按CTRL + Z键组合后,会导致cin
流的EOF状态,您需要将cin
输入流恢复到正常的“良好”状态才能够再次使用它。
在for
循环后添加以下代码,您可以在其中打印向量的内容。
cin.clear();
您还可以使用rdstate()
功能检查标准输入流的状态。除0
以外的任何内容都意味着标准流处于错误状态。
答案 1 :(得分:0)
如前所述,您需要在读取记录失败后清除std::cin
上的错误状态。
std::cin.clear();
应该做的伎俩。以下是我对
的看法.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
。