You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用new动态创建结构体数组,程序无报错但创建3条以上后挂起

问题分析与解决方案

看起来你的程序挂起的主要原因是main函数中多余的cin.ignore()调用,另外还有输入处理不够健壮的小问题,我们一步步来解决:

1. 导致程序挂起的直接原因

在readEvents函数执行完毕后,main里的这段代码存在问题:

cout << "\nEnter a search string: ";
cin.getline(userString, 80, '\n');
cin.ignore(); // 这里是多余的!

cin.getline()的行为是:读取字符直到遇到'\n',然后自动丢弃缓冲区中的'\n',不会把它存入目标数组。此时缓冲区已经是空的,你紧接着调用cin.ignore(),它会尝试从输入流中读取一个字符,但没有输入到来,程序就会阻塞在这里,看起来像是“挂起”了。

你提到3个及以上条目才触发,大概率是测试时的偶然情况(比如前几次输入时不小心多输入了字符,刚好抵消了这个问题),实际上不管创建多少个Event,执行到这一步都会出现阻塞。

2. 输入处理的健壮性问题(避免潜在异常)

另外,readEvents里的cin.ignore()只忽略单个字符,这不够健壮。比如如果用户输入y 空格 回车,cin >> answer会读取'y',剩下的空格和'\n'留在缓冲区,单个cin.ignore()只能忽略空格,'\n'还在,会导致下一次cin.getline()读取空字符串。

我们应该用cin.ignore(numeric_limits<streamsize>::max(), '\n')来忽略直到换行符为止的所有字符,确保缓冲区被清空。需要包含<limits>头文件来使用numeric_limits。

修改后的代码

修正后的main函数部分

#include <limits> // 记得添加这个头文件

int main() {
    Event* event_pointers[100];
    int count = readEvents(event_pointers, 100), userMonth;
    char userString[80];
    cout << "\nEnter a search string: ";
    cin.getline(userString, 80, '\n');
    // 移除多余的cin.ignore()
    linsearch(event_pointers, count, userString);
    cout << "\nEnter a month to list Events for: ";
    cin >> userMonth;
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 换成健壮的ignore方式
    binsearch(event_pointers, count, userMonth);
    for (int j = 0; j < count; j++) //Cleanup loop
        delete event_pointers[j];
    cout << "\nPress any key to continue...";
    (void)_getch();
    return 0;
}

修正后的readEvents函数部分

#include <limits> // 记得添加这个头文件

int readEvents(Event* ev_ptr[], int size) {
    char answer = 'y', slash;
    int i = 0;
    cout << "\nCreate an event [y/n]? ";
    cin >> answer;
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 替换为健壮的ignore
    while (answer == 'y' || answer == 'Y') {
        if (i >= size) { // 增加边界检查,避免数组越界
            cout << "\nReached maximum number of events!";
            break;
        }
        ev_ptr[i] = new Event;
        cout << "\nEnter description: ";
        cin.getline(ev_ptr[i]->desc, 80, '\n');
        cout << "\nEnter date: ";
        cin >> ev_ptr[i]->date.month >> slash >> ev_ptr[i]->date.day >> slash >> ev_ptr[i]->date.year;
        cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 替换
        cout << "\nEnter time: ";
        cin >> ev_ptr[i]->time.hour >> slash >> ev_ptr[i]->time.minute;
        cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 替换
        i++;
        cout << "\nCreate an event [y/n]? ";
        cin >> answer;
        cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 替换
    }
    return i;
}

额外的边界保护

我还在readEvents里增加了数组边界检查:当i >= size时跳出循环,避免因为创建过多Event导致指针数组越界,引发未定义行为(这也可能是潜在的崩溃/挂起原因)。

内容的提问来源于stack exchange,提问作者cVos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:05:39