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

C语言新手求助:如何在函数中存储值到数组并保留数据

问题根源与修复方案

用户问题描述

我正在学习C语言的函数部分,完成一项练习时遇到问题。练习要求:先让用户输入错误值(输入8代表错误8,输入6代表错误6),调用一个函数将这些错误值存储到数组中,再调用另一个函数检查是否存在重复的错误值。
我先让用户输入要存储的错误数量N,循环N次输入值,编写了warning函数用于存储值到数组,但每次调用该函数时,数组中的数据无法保留,例如存入array[0]=7,后续查看时变成乱码,数组并未正确存储值。
我尝试在main函数中存储数组是可行的,但练习要求必须使用其他函数实现,怀疑函数每次调用时数组被重置,希望得到解决建议。


核心问题分析

  • 局部数组无法持久化数据:你在warning函数内部定义的int array[n];是局部自动变量,每次调用warning时都会重新分配栈内存,函数执行结束后内存立即释放,之前存入的数据自然丢失。必须操作main中创建的数组,而非函数内部重新定义。
  • 数组传参退化为指针:C语言中数组作为函数参数时会自动转为指针,sizeof(array)/sizeof(int)无法计算数组实际长度,必须手动传递数组长度参数。
  • 未初始化变量:main中的count未初始化就执行count++,会触发未定义行为,需初始化为0。
  • 错误的输入处理:fflush(stdin)对输入流是未定义行为,不能用来清空输入缓冲区。

修改后的代码

#include <stdio.h>
#include <stdlib.h>

// 检查数组中是否存在重复错误值
void checkDuplicates(int array[], int length) {
    int hasDuplicate = 0;
    for (int i = 0; i < length; i++) {
        for (int j = i + 1; j < length; j++) {
            if (array[i] == array[j]) {
                printf("发现重复错误值:%d\n", array[i]);
                hasDuplicate = 1;
            }
        }
    }
    if (!hasDuplicate) {
        printf("所有错误值均无重复\n");
    }
}

// 将错误值存入指定数组
void storeWarning(int num, int array[], int index) {
    array[index] = num;
}

int main(int argc, char *argv[]) {
    int num, count = 0, n;
    printf("|警告系统|(仅接受大于等于0的值!)\n");
    
    printf("\n请输入要存储的错误数量:");
    // 校验输入有效性,确保是正整数
    while (scanf("%d", &n) != 1 || n <= 0) {
        // 清空输入缓冲区的无效数据
        while (getchar() != '\n');
        printf("请输入正整数:");
    }
    // 清除缓冲区剩余的换行符
    while (getchar() != '\n');

    int array[n];

    do {
        printf("\n请输入大于等于0的错误值:");
        while (scanf("%d", &num) != 1 || num < 0) {
            while (getchar() != '\n');
            printf("请输入大于等于0的值:");
        }
        while (getchar() != '\n');
        
        // 调用函数操作main中的数组
        storeWarning(num, array, count);
        count++;
    } while (count < n);

    // 调用重复检查函数
    checkDuplicates(array, n);

    return 0;
}

关键修改说明

  1. 复用主函数数组:storeWarning函数直接接收main中创建的数组作为参数,操作的是同一个内存空间,避免局部数组销毁导致的数据丢失。
  2. 明确传递数组长度:所有操作数组的函数都额外接收length参数,保证遍历数组的正确性。
  3. 初始化变量:将count初始化为0,确保自增操作合法。
  4. 正确处理输入:用while(getchar() != '\n')清空输入缓冲区,替代未定义行为的fflush(stdin),同时增加输入有效性校验。
  5. 补全重复检查逻辑:实现了嵌套循环对比数组元素的功能,完成练习要求的重复检查需求。

内容的提问来源于stack exchange,提问作者Antônio Velez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:30:59