Я постоянно сталкиваюсь с этой проблемой, когда пытаюсь проверить вводимые пользователем данные, но в своей программе я использую тонны ignores (). Так как это школьная программа Я только ограничено чтобы просто iostream, cctype, а также student.h библиотеки. Проблема в том, что мне нужно убедиться, что пользователь не пытается вводить буквенные символы в целочисленное поле, которое, как я думал, покрыто if(!(cin >> val))
а потом я использую cin.ignore(numeric_limits<streamsize>::max(), '\n');
игнорировать что-либо лишнее (например, если они пытаются ввести десятичное число в поле целого числа). Что-то работает неправильно, хотя я либо не могу ввести в поле имени, либо я получаю оставшийся десятичный знак в качестве имени (если я введу 123.6, имя будет 0,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
Обычно вы бы использовали std::getline(std::string&,std::istream&)
для линейно-ориентированного ввода и разбора числа с istringstream
, Тем не менее, так как вы не можете использовать ни std::string
ни std::stringstream
вам нужно разобрать целое число самостоятельно.
Но сначала объяснение ваших ошибок.
Что-то не работает правильно, хотя я либо не могу ввести в поле имени
При вводе правильного целого числа токен новой строки \n
не извлекается из строки, поэтому cin.getline(student.name, 50);
не будет ничего извлекать: следующий символ в std::cin
является \n
линия заканчивается и std::getline
заливка student.name
с строкой extractet, которая пуста.
или я получаю оставшееся десятичное число как имя (если я введу 123.6, имя будет 0,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>
Других решений пока нет …