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; }
关键修改说明
- 复用主函数数组:
storeWarning函数直接接收main中创建的数组作为参数,操作的是同一个内存空间,避免局部数组销毁导致的数据丢失。 - 明确传递数组长度:所有操作数组的函数都额外接收
length参数,保证遍历数组的正确性。 - 初始化变量:将
count初始化为0,确保自增操作合法。 - 正确处理输入:用
while(getchar() != '\n')清空输入缓冲区,替代未定义行为的fflush(stdin),同时增加输入有效性校验。 - 补全重复检查逻辑:实现了嵌套循环对比数组元素的功能,完成练习要求的重复检查需求。
内容的提问来源于stack exchange,提问作者Antônio Velez
相关产品推荐
相关产品推荐

