1

ユーザー入力を検証しようとすると、一貫してこの問題に遭遇しますが、プログラム全体で大量の ignores() を使用していることに気付きます。これは学校のプログラムなので、 iostreamcctype、およびstudent.hライブラリのみに制限されています。問題は、私がカバーしたと思っていた整数フィールドにユーザーが英字を入力しようとしないようにする必要があることです。if(!(cin >> val))cin.ignore(numeric_limits<streamsize>::max(), '\n');余分なものを無視します (たとえば、整数フィールドに小数を入力しようとした場合)。名前フィールドに入力できないか、残りの小数を名前として取得するため、何かが正しく機能していません (123.6 を入力すると、名前は .6 になります)。大量無視を使用するよりも整数を検証するためのより良い方法を知っている人はいますか?

主要

#include <iostream>
using namespace std;
#include "student.h"
//**************************************************************************
bool validInt(int&);
//**************************************************************************
int main()
{
    Student student;
    bool validInput;

    cout << "You have Chosen to Add a New Student." << endl;
    cout << "---------------------------------------" << endl;

    // Student ID Validation
    do
    {
        cout << "Enter Student ID (ex. 123): ";
        validInput = validInt(student.id);
    }while(!validInput);

    cout << "Enter Student Name (ex. John Doe): ";
    cin.getline(student.name, 50);

    cout << "Enter Student City and State (ex. St. Louis, Missouri): ";
    cin.getline(student.citystate, 50);

    cout << "\n\nStudent ID: " << student.id << endl;
    cout << "Student Name: " << student.name << endl;
    cout << "Student City / State: " << student.citystate << endl;

    return 0;
}
//**************************************************************************
bool validInt(int& val)
{
    bool valid = true;
    if(!(cin >> val))
    {
        cout << "\nERROR: Please enter a Positive Whole Number" << endl;
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        valid = false;
    }
    return valid;
}

学生ヘッダー

#ifndef STUDENT_H
#define STUDENT_H
//**************************************************************************
struct Student
{
    int id;
    char name[50];
    char citystate[50];

    friend ostream& operator<<(ostream& out, const Student& data);

    bool operator == (const Student &rhs) const;
    bool operator != (const Student &rhs) const;
    bool operator < (const Student &rhs) const;
    bool operator > (const Student &rhs) const;
    bool operator <= (const Student &rhs) const;
    bool operator >= (const Student &rhs) const;
};
//**************************************************************************
ostream& operator << (ostream& out, const Student& data)
{
    out << data.id << " " << data.name << endl;
    return out;
}
//**************************************************************************
bool Student::operator == (const Student &rhs) const
{
    return (this->id == rhs.id);
}
//**************************************************************************
bool Student::operator != (const Student &rhs) const
{
    return (this->id != rhs.id);
}
//**************************************************************************
bool Student::operator < (const Student &rhs) const
{
    return (this->id < rhs.id);
}
//**************************************************************************
bool Student::operator > (const Student &rhs) const
{
    return (this->id > rhs.id);
}
//**************************************************************************
bool Student::operator <= (const Student &rhs) const
{
    return (this->id <= rhs.id);
}
//**************************************************************************
bool Student::operator >= (const Student &rhs) const
{
    return (this->id >= rhs.id);
}
#endif
4

1 に答える 1

2

通常std::getline(std::string&,std::istream&)、行指向の入力に使用し、数値を。で解析しistringstreamます。ただし、どちらstd::stringも使用することは許可されていないstd::stringstreamため、整数を自分で解析する必要もありません。

しかし、最初にあなたのエラーの説明。

説明

名前フィールドに入力できないため、何かが正しく機能していません

正しい整数を入力すると、改行トークン\nは文字列から抽出されません。そのため、cin.getline(student.name, 50);何も抽出されません。次の文字std::cin\n、行が終了し、空の抽出行でstd::getline埋められます。student.name

または、残りの小数を名前として取得します(123.6と入力すると、名前は.6になります)。

繰り返しますが、これは同じです。整数のみを抽出し、残りの行は抽出しません。

一時的な解決策

validIntあなたの:の残りの行を無視してください

bool validInt(int& val)
{
    bool valid = true;
    if(!(cin >> val))
    {
        cout << "\nERROR: Please enter a Positive Whole Number" << endl;
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        valid = false;
    }
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    return valid;
}

正しい解決策

正しい解決策はもう少し複雑です。単一の文字を抽出し、それらが数字(またはマイナスまたはプラス)であるかどうかをチェックし、それらを整数として保存し、残りの行を無視するものを作成する必要があるためです。心配しないでください、これは<iostream>

于 2012-11-27T07:31:51.523 に答える