gpt4 book ai didi

C++ 验证 - 截断设置为下一个输入

转载 作者:行者123 更新时间:2023-11-30 04:22:52 27 4
gpt4 key购买 nike

我一直在尝试验证用户输入时遇到这个问题,但我发现自己在整个程序中使用了大量的 ignores()。因为这是一个学校程序,所以我只限于 iostreamcctype学生.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

最佳答案

通常你会使用 std::getline(std::string&,std::istream&)对于面向行的输入并使用 istringstream 解析数字.但是,由于不允许您同时使用 std::string也不std::stringstream您需要自己解析整数。

但首先要解释你的错误。

说明

Something is not working correctly though as I am either unable to input into name field

当您输入正确的整数时,换行符 \n不是从字符串中提取的,这就是为什么 cin.getline(student.name, 50);不会提取任何内容:std::cin 中的下一个字符是\n , 该行结束并且 std::getline填充 student.name带有提取线,它是空的。

or I get the remaining decimal as the name (if I enter 123.6, the name will be .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> 才有可能做到这一点

关于C++ 验证 - 截断设置为下一个输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13578584/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com