Проверка C ++ — усечение установлено в качестве следующего ввода

Я постоянно сталкиваюсь с этой проблемой, когда пытаюсь проверить вводимые пользователем данные, но в своей программе я использую тонны 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

1

Решение

Обычно вы бы использовали 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>

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]