c++ - 如果用户尝试在 C++ 中输入意外类型的信息,如何处理异常
问题描述
我正在编写程序,如果用户尝试输入意外类型的信息,我应该处理异常(例如,如果输入数字并且所需的是字符串,则要求他重新输入有效输入)。
问题是我的代码适用于所有 (int) 类型(例如,如果用户在 (int) 字段中输入字符串,则会给出重新输入的消息)。但是,它不适用于 (string) 类型。
这是我的代码:
void TA::AddnewTA(TA TA_Arr[], TA New_TA_Arr[], int &TA_Arr_Num, int &New_TA_Arr_Count)
{
// Prompt the user to enter the TA ID
while (true)
{
cout << "Please Enter TA ID:\n";
cin >> New_TA_Arr[New_TA_Arr_Count].Student_ID;
while (1)
{
// Checking if the ID entered is of an unexpected type (handle the ID exception)
// Using (cin.ignore) to ignore data entered to the end of line along with clean
if (cin.fail())
{
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Unexpected Type is entered, Please Enter once more a valid ID input: " << endl;
cin >> New_TA_Arr[New_TA_Arr_Count].Student_ID;
}
// If the type is correct, break & go check if the ID entered is duplicated or not
if (!cin.fail())
break;
}
// Use Duplicate_Student_ID Function to check on the ID existence
// If the ID is already there, then request from the user to enter another ID
if (Duplicate_Student_ID(TA_Arr, New_TA_Arr, TA_Arr_Num, New_TA_Arr_Count, New_TA_Arr[New_TA_Arr_Count].Student_ID) == true)
{
cout << "Unfortunately, Your Entered ID is Already Exist. Please Enter Another Valid ID\n";
continue;
}
// If it is a New ID, then complete to the First Name Data!!
else {break;}
}
// Prompt the user to enter the TA First Name
cout << "Please Enter TA First Name: ";
cin >> New_TA_Arr[New_TA_Arr_Count].First_N;
while (1)
{
// Checking if the First Name entered is of an unexpected type (handle the First Name exception)
// Using (cin.ignore) to ignore data entered to the end of line along with clean
if (cin.fail())
{
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Unexpected Type is entered, Please Enter once more a valid First Name input:" << endl;
cin >> New_TA_Arr[New_TA_Arr_Count].First_N;
}
// If the type is correct, break & go to Last Name Entry Data
if (!cin.fail())
break;
}
// Prompt the user to enter the TA Last Name
cout << "Please Enter TA Last Name: ";
cin >> New_TA_Arr[New_TA_Arr_Count].Last_N;
while (1)
{
// Checking if the Last Name entered is of an unexpected type (handle the Last Name exception)
// Using (cin.ignore) to ignore data entered to the end of line along with clean
if (cin.fail())
{
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Unexpected Type is entered, Please Enter once more a valid Last Name input:" << endl;
cin >> New_TA_Arr[New_TA_Arr_Count].Last_N;
}
// If the type is correct, break & go to Start Hire year Entry Data
if (!cin.fail())
break;
}
// Prompt the user to enter the TA Start Year of Hire
cout << "Please Enter TA Start Hire year: ";
cin >> New_TA_Arr[New_TA_Arr_Count].Start_Hire_Year;
while (1)
{
// Checking if the Start Hire year entered is of an unexpected type (handle the Start Hire year exception)
// Using (cin.ignore) to ignore data entered to the end of line along with clean
if (cin.fail())
{
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Unexpected Type is entered, Please Enter once more a valid Start Hire year input:" << endl;
cin >> New_TA_Arr[New_TA_Arr_Count].Start_Hire_Year;
}
// If the type is correct, break & go to End Hire year Entry Data
if (!cin.fail())
break;
}
// Prompt the user to enter the TA Class (Grad/Alum)
cout << "Please Enter TA Class (Grad/Alum): ";
cin >> New_TA_Arr[New_TA_Arr_Count].Class;
while (1)
{
// Checking if the TA Class entered is of an unexpected type (handle the Class exception)
// Using (cin.ignore) to ignore data entered to the end of line along with clean
if (cin.fail())
{
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Unexpected Type is entered, Please Enter once more a valid Class input:" << endl;
cin >> New_TA_Arr[New_TA_Arr_Count].Class;
}
// If the type is correct, break & go to TA Working Hours Entry Data
if (!cin.fail())
break;
}
// Prompt the user to enter the TA Working Hours
cout << "Please Enter TA Working Hours: ";
cin >> New_TA_Arr[New_TA_Arr_Count].Working_H_Num;
while (1)
{
// Checking if the TA Working Hours entered is of an unexpected type (handle the Working Hours exception)
// Using (cin.ignore) to ignore data entered to the end of line along with clean
if (cin.fail())
{
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Unexpected Type is entered, Please Enter once more a valid Working Hours input:" << endl;
cin >> New_TA_Arr[New_TA_Arr_Count].Working_H_Num;
}
// If the type is correct, break & call the function to print all attributes to the main function in Test Driver
if (!cin.fail())
break;
}
// Count Up the New TA Array Counter to add the New Added TA Info to the TAs.txt
New_TA_Arr_Count++;
}
因此,ID 和 Working_H_Num 有效,但 First、Last names 和 Class 无效!!请帮忙!!
解决方案
你试过 if (isalpha) 吗?如果你通过一个类似你可以在 ( http://www.cplusplus.com/reference/cctype/isalpha/ ) 找到的程序传递它,你可以得到我认为你想要的。作为一个例子,我写了一个小东西来演示 isalpha。祝你好运。
#include <iostream>
#include <string>
#include <ctype.h>
using namespace std;
main()
{
string str;
cout <<"enter a string or int"<<endl;
cin >>str;
cout<<endl;
while (str[0])
{
if (isalpha(str[0])){
cout<<"its a string";
return 0;
}
else{
cout << "its a number";
return 0;
}
}
return 0;
}
推荐阅读
- azure - 从我的公司 Azure 订阅通过 Azure Functions 发送电子邮件,使用公司电子邮件地址作为发件人和收件人
- inference - 将 ONNX 模型转换为 Caffe2 时的问题
- javascript - threejs - 网格上的 customDepthMaterial 属性未包含在 scene.toJSON 输出中
- javascript - 如何在角度应用程序中设置组件 RasaHQ/chatroom 的样式和设置良好位置
- asp.net-core - Identity Server 4 OIDC 授权码流多租户
- c++ - 迭代器不打印 C++ 中的所有地图
- php - 当我合并 2 个图像时出现问题,png 以白色显示背景
- jenkins - jenkins docker slave 映像不会启动
- javascript - 带有小数的正数和负数的负匹配正则表达式
- azure - 如何使用 docker compose YAML 在 Azure 中挂载 docker 卷