ユーザー入力を検証しようとすると、一貫してこの問題に遭遇しますが、プログラム全体で大量の ignores() を使用していることに気付きます。これは学校のプログラムなので、 iostream、cctype、および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