3

C++ を練習するために、ユーザーが名前の後にスコアを入力できるようにし、ユーザーが名前を入力してその名前が入力されたスコアを取得できるようにする簡単なプログラムを作成しようとしています。プログラムは、名前の入力が完了したらエスケープ文字 (ctrl + z) を入力するまで正常に動作します。エスケープ文字を入力すると、プログラムは「スコアを検索するために学生の名前を入力してください」という行を出力しますが、ユーザーは許可しません。名前を入力し、代わりに「Press any key to exit」と読み上げます。これを修正する方法に完全に困惑しており、どんな助けも大歓迎です。

#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

ストリームにEOF 状態を引き起こす CTRL+Z キーの組み合わせを押した後、再び使用できるようにするにcinは、入力ストリームを通常の「正常な」状態に戻す必要があります。ベクトルの内容を出力cinするループの後に次のコードを追加します。for

cin.clear();

関数を使用して、標準入力ストリームの状態を確認することもできrdstate()ます。それ以外0は、標準ストリームがエラー状態であることを意味します。

于 2013-08-05T20:34:58.457 に答える
0

std::cin言われたように、レコードの読み取りが失敗した後、エラー状態をクリアする必要があります。

std::cin.clear();

トリックを行う必要があります。これを使用した私の見解は次のとおりです

  • 2 つの分離されたベクトルではなく、適切なデータ構造
  • const の正しさ
  • 関数の分離
  • .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;
    }
}

連続したストレージが必要な場合はflat_map、boost のようなものを使用してください。

于 2013-08-05T20:49:48.653 に答える