如何保存函数生成的数组供其他函数调用?C++代码问题求助
问题根源
你的代码里,evenCollegeNums、bSortCollegeNums、executeFunctions这些函数内部都主动调用了addCollegeNums(),这就导致每次执行这些函数时都会重新触发输入流程。而且main()里调用选项1生成数组后,没有把数组指针保存下来,后续调用其他选项时根本没用到之前生成的数组,反而重新生成。
解决思路
- 在
main()中维护两个核心变量:存储学号的数组指针,以及实际的学生数量(避免只靠0判断元素是否有效) - 改造所有需要操作数组的函数,让它们接收数组指针和学生数量作为参数,不再自行调用
addCollegeNums() - 修复原代码里的潜在bug,比如
addCollegeNums()中num未初始化、循环边界错误、内存泄漏等
修改后的完整代码
#include <iostream> #include <string> using namespace std; // 生成学号数组,同时通过引用返回学生数量 int* addCollegeNums(int& studentCount) { int num = 0; cout << "\nHow many students are there? "; while (num < 1 || num > 25) { cin >> num; if (num < 1) { cout << "Not enough students! Please enter again: "; } else if (num > 25) { cout << "Too many students! Please enter again: "; } } studentCount = num; cout << "Give me their college numbers: " << endl; int* collegenums = new int[25]; // 初始化数组所有元素为0 for (size_t i = 0; i < 25; i++) { collegenums[i] = 0; } for (int i = 0; i < num; i++) { cin >> collegenums[i]; // 校验学号范围 if (collegenums[i] < 23621130 || collegenums[i] > 23621155) { cout << "Invalid number! Please enter again: "; i--; continue; } // 校验重复学号 bool isDuplicate = false; for (int j = 0; j < i; j++) { if (collegenums[i] == collegenums[j]) { cout << "This number already exists! Please enter again: "; isDuplicate = true; break; } } if (isDuplicate) { i--; } } return collegenums; } // 接收数组指针和学生数量,返回最小的偶数学号 int evenCollegeNums(int* collegenums, int studentCount) { int minEven = -1; for (int i = 0; i < studentCount; i++) { if (collegenums[i] % 2 == 0) { if (minEven == -1 || collegenums[i] < minEven) { minEven = collegenums[i]; } } } return minEven; } // 接收数组指针和学生数量,返回排序后的数组 int* bSortCollegeNums(int* collegenums, int studentCount) { int* sortedArray = new int[25]; // 复制原数组内容 for (int i = 0; i < 25; i++) { sortedArray[i] = collegenums[i]; } // 冒泡排序仅处理有效元素 for (int j = 0; j < studentCount - 1; j++) { for (int i = 0; i < studentCount - 1 - j; i++) { if (sortedArray[i] > sortedArray[i + 1]) { swap(sortedArray[i], sortedArray[i + 1]); } } } return sortedArray; } // 接收数组指针和学生数量,执行所有输出操作 void executeFunctions(int* collegenums, int studentCount) { cout << "\nThese are all College Numbers: "; for (int i = 0; i < studentCount; i++) { cout << collegenums[i] << " "; } int minEven = evenCollegeNums(collegenums, studentCount); cout << "\nThe lowest even College Number is: " << minEven; int* sortedArray = bSortCollegeNums(collegenums, studentCount); cout << "\nCollege Numbers in Ascending order: "; for (int i = 0; i < studentCount; i++) { cout << sortedArray[i] << " "; } cout << endl; // 释放排序数组的内存,避免泄漏 delete[] sortedArray; } int main() { cout << "Choose an option:\n" << "1. Input College Numbers of Students\n" << "2. Find the minimal even College Number\n" << "3. Sort the College Numbers in Ascending order\n" << "4. Print out all info\n" << "5. Quit\n"; int options; int* collegenums = nullptr; int studentCount = 0; do { cout << "Option: "; cin >> options; switch(options) { case 1: // 释放之前的数组内存,避免泄漏 if (collegenums != nullptr) { delete[] collegenums; } collegenums = addCollegeNums(studentCount); break; case 2: if (collegenums == nullptr) { cout << "Please input college numbers first (option 1)!\n"; break; } cout << "\nThe lowest even College Number is: " << evenCollegeNums(collegenums, studentCount) << endl; break; case 3: if (collegenums == nullptr) { cout << "Please input college numbers first (option 1)!\n"; break; } int* sorted = bSortCollegeNums(collegenums, studentCount); cout << "\nCollege Numbers in Ascending order: "; for (int i = 0; i < studentCount; i++) { cout << sorted[i] << " "; } cout << endl; delete[] sorted; break; case 4: if (collegenums == nullptr) { cout << "Please input college numbers first (option 1)!\n"; break; } executeFunctions(collegenums, studentCount); break; case 5: { string qornotq; cout << "Are you sure? Y/N: "; cin >> qornotq; if (qornotq == "Y" || qornotq == "y") { // 退出前释放数组内存 if (collegenums != nullptr) { delete[] collegenums; } options = 5; } else { options = 0; } break; } default: cout << "There isn't such an option as " << options << ". Please try again!\n"; } } while (options != 5); return 0; }
关键修改点
- 状态维护:在
main()中新增collegenums指针和studentCount变量,专门存储生成后的数组和实际学生数量,确保后续操作复用同一组数据 - 函数参数重构:将
evenCollegeNums、bSortCollegeNums、executeFunctions全部改为接收数组指针+学生数量作为输入参数,彻底移除内部调用addCollegeNums()的逻辑 - 潜在bug修复:
- 初始化
addCollegeNums()中的num变量,避免未定义行为 - 简化重复学号的校验逻辑,提升可读性
- 新增内存释放步骤,解决原代码的内存泄漏问题
- 增加前置校验:用户未输入学号就调用其他选项时,给出明确提示
- 修正冒泡排序的循环边界,只针对有效学生数量排序,避免无效的0元素干扰
- 初始化
内容的提问来源于stack exchange,提问作者Just_Me
相关产品推荐
相关产品推荐

