首页 > 解决方案 > 如果用户尝试在 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 无效!!请帮忙!!

标签: c++functionexception

解决方案


你试过 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;
}

推荐阅读