1

我一直遇到这个问题,我试图验证用户输入,但我发现自己在整个程序中使用了大量的 ignores()。由于这是一个学校课程,我只限于iostream cctypestudent.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
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,名称将是 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>

于 2012-11-27T07:31:51.523 回答