使用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

