改用scanf读取变量z后C程序崩溃,求问题排查与解决
解决你的程序崩溃与功能错误问题
让我们一步步排查你代码里的问题,这些问题不仅导致了程序崩溃,还无法实现你要的统计功能:
关键错误点
- 未初始化的
count变量:在functie函数里,count没有初始值就直接进行count=count+1操作,这会触发未定义行为,可能导致程序崩溃或统计结果完全错误。 - 错误的
z读取逻辑:你在main里尝试读取z时用错了函数(fscanf("%d", &z);没有指定文件指针,应该用scanf("%d", &z);从键盘输入),同时functie函数里又重复调用scanf("%d", &z);,这会导致程序额外等待输入,甚至打乱输入流,引发崩溃。 - 返回值与输出不匹配:
functie函数返回的是z,但你需要返回的是统计的次数count;而且main里的fprintf(g,"%d %d", functie(v,nr,z));写了两个%d占位符,却只传了一个返回值,这会导致输出错误,甚至程序崩溃。 - 未检查文件是否成功打开:如果
data-in.txt不存在,f=fopen("data-in.txt", "r");会返回NULL,后续的fscanf操作会直接崩溃,必须添加文件打开检查。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> // 统计z在数组v中出现的次数 int functie(int v[], int nr, int z) { int i, count = 0; // 必须初始化count为0 for(i = 0; i < nr; i++) { if(z == v[i]) { count++; // 简化写法,和count=count+1等价 } } return count; // 返回统计的次数,而不是z } int main() { int i, nr, z; // 从标准输入(键盘)读取z printf("请输入z的值:"); scanf("%d", &z); FILE *f = fopen("data-in.txt", "r"); // 检查文件是否成功打开 if(f == NULL) { printf("无法打开data-in.txt文件!\n"); return 1; // 异常退出 } fscanf(f, "%d", &nr); int *v = malloc(nr * sizeof(int)); // 检查内存分配是否成功 if(v == NULL) { printf("内存分配失败!\n"); fclose(f); return 1; } for(i = 0; i < nr; i++) { fscanf(f, "%d", &v[i]); } FILE *g = fopen("data-out.txt", "w"); if(g == NULL) { printf("无法打开data-out.txt文件!\n"); free(v); fclose(f); return 1; } // 输出z和对应的统计次数,这里需要两个参数:z和functie的返回值 fprintf(g, "%d %d", z, functie(v, nr, z)); printf("统计完成,结果已写入data-out.txt\n"); // 释放资源 fclose(f); fclose(g); free(v); return 0; }
代码说明
- 初始化
count:将count初始化为0,确保统计从0开始累加。 - 修正
z的读取:在main里用scanf从键盘读取z,functie函数不再重复读取,直接使用传入的z值。 - 返回正确的统计结果:
functie返回count,也就是z出现的次数。 - 修复输出格式:
fprintf传入两个参数z和统计次数,对应两个%d占位符。 - 添加错误检查:检查文件打开和内存分配是否成功,避免程序因资源获取失败而崩溃。
测试一下你给的示例:
data-in.txt内容:4 1 2 3 3- 输入
z=3,程序会在data-out.txt中写入3 2,完全符合你的需求。
内容的提问来源于stack exchange,提问作者themarksmaker




