怎么解决运行时输入错误,请重新输入以及专业无法输入的问题

#include<iostream>
using namespace std;
#include<string>
#define MAX 1000
 
 
// 设计联系人结构体
struct Person
{
    // 姓名
    string m_Name;
    // 性别  1:男  2:女
    int m_sex;
    //地址
    string m_Addr;
    // 电话
    string m_Phone;
    // 学校
    int m_school;
    // 专业
    int m_major;
};
 
struct Addressbooks
{
    // 通讯录中保存的联系人数组
    struct Person personArray[MAX];
 
    // 通讯录中当前记录联系人个数
    int m_size;
};
 
 
// 1.菜单页面
void showMenu()
{
    cout << "*****************************" << endl;
    cout << "*****     1:添加联系人    *****" << endl;
    cout << "*****     2:显示联系人    *****" << endl;
    cout << "*****     3:删除联系人    *****" << endl;
    cout << "*****     4:查找联系人    *****" << endl;
    cout << "*****     5:修改联系人    *****" << endl;
    cout << "*****     0:退出通讯录    *****" << endl;
    cout << "*****************************" << endl;
}
 
// 2.添加联系人
void addPerson(Addressbooks* abs)
{
    // 判断通讯录是否已满
    if (abs->m_size == MAX)
    {
        cout << "通讯录已满,无法添加" << endl;
        return;
    }
    else
    {
        // 姓名
        string name;
        cout << "请输入姓名:" << endl;
        cin >> name;
        abs->personArray[abs->m_size].m_Name = name;
 
        // 性别
        cout << "请输入性别(1:男  2:女):" << endl;
        int sex = 0;
        
        while (true)
        {
            cin >> sex;
            if (sex == 1 || sex == 2)
            {
                abs->personArray[abs->m_size].m_sex = sex;
                break;
            }
            cout << "输入有误,请重新输入" << endl;
        }
        
        // 地址
        string address;
        cout << "请输入地址:" << endl;
        cin >> address;
        abs->personArray[abs->m_size].m_Addr = address;
 
        // 电话
        string phone;
        cout << "请输入电话:" << endl;
        cin >> phone;
        abs->personArray[abs->m_size].m_Phone = phone;
 
        // 学校
        int school;
        cout << "请输入学校:" << endl;
        cin >> school;
        abs->personArray[abs->m_size].m_school = school;

        // 专业
        int major;
        cout << "请输入专业:" << endl;
        cin >> major;
        abs->personArray[abs->m_size].m_major = major;


        // 更新通讯录人数
        abs->m_size++;
 
        cout << "添加成功" << endl;
 
        system("pause");    // 按下任意键继续
        system("cls");        // 清屏
    }
}
 
// 显示联系人
void showPerson(Addressbooks* abs)
{
    // 判断通讯录中人数是否为0
    if (abs->m_size == 0)
    {
        cout << "通讯录为空" << endl;
        return;
    }
    else
    {
        for (int i = 0; i < abs->m_size; i++)
        {
            cout << "姓名:" << abs->personArray[i].m_Name << endl;
            cout << "性别(1:男  2:女):" << (abs->personArray[i].m_sex == 1 ? "男" : "女") << endl;
            cout << "地址" << abs->personArray[i].m_Addr << endl;
            cout << "电话:" << abs->personArray[i].m_Phone << endl;
            cout << "学校:" << abs->personArray[i].m_school << endl;
            cout << "专业:" << abs->personArray[i].m_major << endl;
        }
    }
    system("pause");
    system("cls");
}
 
// 检测联系人是否存在,存在返回编号,不存在返回-1
int isExit(Addressbooks* abs, string name)
{
    for (int i = 0; i < abs->m_size; i++)
    {
        if (abs->personArray[i].m_Name == name)
        {
            return i;
        }
 
    }
    return -1;
}
 
// 删除指定联系人
void deletePerson(Addressbooks* abs)
{
    cout << "请输入删除联系人姓名:" << endl;
    string name;
    cin >> name;
 
    int judge;
    judge = isExit(abs, name);
    if(judge == -1)
    {
        cout << "查无此人" << endl;
    }
    else
    {
        // 数据前移
        for (int i = judge; i < abs->m_size; i++)
        {
            abs->personArray[i] = abs->personArray[i + 1];
        }
        abs->m_size--;
        cout << "删除成功" << endl;
    }
    system("pause");
    system("cls");
}
 
// 查找指定联系人
void findPerson(Addressbooks* abs)
{
    cout << "请输入查找的联系人姓名:" << endl;
    string name;
    cin >> name;
 
    int judge;
    judge = isExit(abs, name);
    if (judge == -1)
    {
        cout << "查无此人" << endl;
    }
    else
    {
        cout << "姓名:" << abs->personArray[judge].m_Name << endl;
        cout << "性别(1:男  2:女):" << (abs->personArray[judge].m_sex == 1 ? "男" : "女") << endl;
        cout << "地址" << abs->personArray[judge].m_Addr << endl;
        cout << "电话:" << abs->personArray[judge].m_Phone << endl;
        cout << "学校:" << abs->personArray[judge].m_school << endl;
        cout << "专业:" << abs->personArray[judge].m_major << endl;
    }
    system("pause");
    system("cls");
}
 
// 更改指定联系人
void modifyPerson(Addressbooks* abs)
{
    cout << "请输入更改的联系人姓名:" << endl;
    string name;
    cin >> name;
 
    int judge;
    judge = isExit(abs, name);
    if (judge == -1)
    {
        cout << "查无此人" << endl;
    }
    else
    {
        while (true)
        {
            cout << "姓名:" << abs->personArray[judge].m_Name << endl;
            cout << "性别(1:男  2:女):" << (abs->personArray[judge].m_sex == 1 ? "男" : "女") << endl;
            cout << "地址" << abs->personArray[judge].m_Addr << endl;
            cout << "电话:" << abs->personArray[judge].m_Phone << endl;
            cout << "学校:" << abs->personArray[judge].m_school <<endl;
            cout << "专业:" << abs->personArray[judge].m_major <<"\n" << endl;
 
            cout << "请输入要修改的内容\n1:姓名\t2:性别\t3:地址\t4:电话\t5:学校\t6:专业\t0:退出" << endl;
            int rev;
            cin >> rev;
            switch (rev)
            {
            case 1:
            {
                cout << "请输入更改后的姓名" << endl;
                string new_name;
                cin >> new_name;
                abs->personArray[judge].m_Name = new_name;
                break;
            }
            case 2:
            {
                cout << "请输入更改后的性别" << endl;
                int new_sex;
                while (true)
                {
                    cin >> new_sex;
                    if (new_sex == 1 || new_sex == 2)
                    {
                        abs->personArray[judge].m_sex = new_sex;
                        break;
                    }
                    cout << "输入有误,请重新输入" << endl;
                }
                break;
            }
            case 3:
            {
                string new_address;
                cout << "请输入地址:" << endl;
                cin >> new_address;
                abs->personArray[judge].m_Addr = new_address;
                break;
            }
            case 4:
            {
                string new_phone;
                cout << "请输入更改后的电话:" << endl;
                cin >> new_phone;
                abs->personArray[judge].m_Phone = new_phone;
                break;
            }
            case 5:
            {
                int new_school;
                cout << "请输入更改后的学校:" << endl;
                cin >> new_school;
                abs->personArray[judge].m_school = new_school;
                break;
            }
            case 6:
                int new_major;
                cout << "请输入更改后的专业:" << endl;
                cin >> new_major;
                abs->personArray[judge].m_major = new_major;
                break;
            case 0:
            {
                cout << "修改完成" << endl;
                system("pause");
                system("cls");
                return;
            }
            default:
                break;
            }
 
            system("pause");
            system("cls");
        }
    }
}
 
int main()
{
    // 创建通讯录结构体变量
    Addressbooks abs;
    // 初始化通讯录中当前人员个数
    abs.m_size = 0;
 
 
    int select = 0;        // 用户选择变量
 
    while (true)
    {
        showMenu();
 
        cin >> select;
 
        switch (select)
        {
        case 1:        // 添加联系人
            addPerson(&abs);
            break;
        case 2:        // 显示联系人
            showPerson(&abs);
            break;
        case 3:        // 删除联系人
            deletePerson(&abs);
            break;
        case 4:        // 查找联系人
            findPerson(&abs);
            break;
        case 5:        // 修改联系人
            modifyPerson(&abs);
            break;
        case 0:        // 退出通讯录
        {
            cout << "欢迎下次使用" << endl;
            system("pause");
            return 0;
        }
        default:
            break;
        }
    }
}

### 回答1: cin.getline是C++中用于从输入流中读取一行字符的函数。如果输入的行字符长度超过了指定的缓冲区大小,就会导致运行时错误。 要解决这个问题,可以增加缓冲区的大小,以确保它足够大以容纳输入的数据。可以使用以下方法来解决问题: 1. 明确指定缓冲区的大小,以便它足够大以容纳输入的数据。例如: ```c++ char buffer[256]; cin.getline(buffer, 256); ``` 2. 使用动态分配的缓冲区,以便在运行时可以根据需要调整大小。例如: ```c++ char* buffer = nullptr; size_t bufferSize = 0; cin >> bufferSize; buffer = new char[bufferSize]; cin.getline(buffer, bufferSize); // 使用完后要记得释放内存 delete[] buffer; ``` 使用以上两种方法可以确保缓冲区足够大以容纳输入的数据,从而避免因行字符过长而导致的运行时错误。 ### 回答2: 当使用cin.getline()接收输入时,如果输入的字符数超过了定义的字符数组的大小,会导致运行结果错误。为了解决这个问题,可以采取以下措施: 1. 使用动态数组:使用new运算符动态分配内存来创建字符数组,以容纳较长的输入。这样可以根据需要调整数组的大小,并且避免了数组过小而导致的错误。 2. 使用字符串类:可以使用C++中的string类,而不是字符数组来接收输入。string类可以自动扩展和收缩以容纳任意长度的输入,避免了数组大小的限制。可以使用getline()函数接收输入,而不是cin.getline()。 3. 输入验证:在接收输入之前,可以添加输入验证的代码,以确保输入的字符数不会超过所定义的数组大小。可以使用strlen()函数获取输入的字符数,并与数组大小进行比较,如果超过了限制,提示用户重新输入。 4. 清除缓冲区:当输入超过数组大小时,可能会导致缓冲区中还有剩余字符未被读取而影响后续输入。可以使用cin.ignore(numeric_limits<streamsize>::max(), '\n')清除缓冲区中的剩余字符。此语句会忽略缓冲区中的所有字符,直到遇到换行符为止。 通过以上措施,可以有效解决cin.getline输入过长导致的运行结果错误。根据具体情况选择合适的方法来解决问题,以确保程序的正常运行和良好的用户体验。 ### 回答3: 当使用cin.getline函数进行输入时,如果输入的字符数超过了目标数组的大小,就会导致运行结果错误。为了解决这个问题,我们可以采取以下措施。 1. 使用string类代替字符数组:可以使用string类代替字符数组来接收输入,它可以根据输入的字符数自动调整大小,从而避免了数组大小限制的问题。例如,可以使用string类型的变量来接收输入,如下所示: ``` string str; cin >> str; ``` 或者使用getline函数: ``` string str; getline(cin, str); ``` 2. 设置输入流的最大字符数限制:可以使用istream类的成员函数ignore来设置输入流的最大字符数限制,从而避免输入过长导致的错误。例如,可以将输入流的最大字符数限制为100,如下所示: ``` char buffer[101]; cin.ignore(100, '\n'); cin.getline(buffer, 100); ``` 这样,当用户输入超过100个字符时,就会被cin.ignore函数忽略掉,从而避免错误。 3. 检查用户输入的字符数:可以在接收输入之后,通过调用字符串的size函数来检查用户输入的字符数是否超过了期望的大小。如果超过了,可以提醒用户重新输入,或者截取超过部分的字符。例如: ``` char buffer[101]; cin.getline(buffer, 100); if (strlen(buffer) >= 100) { cout << "输入过长,重新输入!" << endl; // 或者截取超过部分的字符 buffer[100] = '\0'; } ``` 总之,要解决cin.getline输入过长导致的运行结果错误,可以使用string类代替字符数组、设置输入流的最大字符数限制或者检查用户输入的字符数,从而避免错误的发生。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值