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

如何保存函数生成的数组供其他函数调用?C++代码问题求助

问题根源

你的代码里,evenCollegeNums、bSortCollegeNums、executeFunctions这些函数内部都主动调用了addCollegeNums(),这就导致每次执行这些函数时都会重新触发输入流程。而且main()里调用选项1生成数组后,没有把数组指针保存下来,后续调用其他选项时根本没用到之前生成的数组,反而重新生成。

解决思路

  1. 在main()中维护两个核心变量:存储学号的数组指针,以及实际的学生数量(避免只靠0判断元素是否有效)
  2. 改造所有需要操作数组的函数,让它们接收数组指针和学生数量作为参数,不再自行调用addCollegeNums()
  3. 修复原代码里的潜在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:30:20