程序特定节点后printf失效,均值无法输出至命令行与文件
问题分析与修复方案
你的程序在读取完数据后直接崩溃,导致后续均值计算与输出代码完全无法执行,核心原因是非法内存访问,同时存在多处代码逻辑错误,以下是具体问题和修复步骤:
核心致命错误:size变量的误用
你定义了int **size;(二级指针),但却将fscanf的返回值(匹配成功的参数数量,是int类型)赋值给它,后续又尝试用size[f][0]访问二维数组——size从未指向任何有效内存空间,这种非法访问会直接触发内存错误,导致程序崩溃。
你实际应该用已经定义好的x和y数组来存储数据并计算均值,size变量完全是多余且错误的。
其他代码错误
main函数声明不符合标准:C标准中main函数必须返回int类型,而非void main(void),需改为int main(void),并在函数末尾添加return 0;。scanf参数错误:scanf("%s", &Check);中Check是数组名,本身就是内存地址,无需加&,应改为scanf("%s", Check);。- 数组下标逻辑混乱:读取数据时从
i=1开始使用x[i]和y[i],但计算均值时循环从f=0开始,x[0]和y[0]未初始化,会引入垃圾值。 - 未关闭输入文件:读取完数据后未关闭
F指针,会导致资源泄漏,需添加fclose(F);。 - 文件打开未做错误检查:打开
results.txt时未判断是否成功,若文件无法打开会导致后续操作空指针,需增加if(R == NULL)的判断逻辑。 - 硬编码循环次数:数据是365个点,但读取循环写的是
i<=500,均值计算又硬写f<=365,应记录实际读取的数据数量,避免越界或计算错误。
修复后的完整代码
#include <stdio.h> int main(void) { char Check[32] = {'\0'}; FILE *F = NULL; FILE *R; int x[500], y[500]; int count = 0; // 记录实际读取的有效数据数量 // 检查结果文件是否成功打开 R = fopen("results.txt", "w"); if (R == NULL) { printf("Error: cannot open results.txt\n"); return 1; } // 输入并打开目标数据文件 while (F == NULL) { printf("What is the name of the file?\n"); scanf("%s", Check); F = fopen(Check, "r"); if (F == NULL) { printf("Error: file not found\n"); } } // 读取数据 for (int i = 0; i < 500; i++) { // 统一从0开始使用数组下标 int ret = fscanf(F, "%d %d", &x[i], &y[i]); if (ret == EOF || ret != 2) { // 确保读取到两个有效整数 break; } count++; printf("Temperatures on Day %d in 1930 = %d\t 2001 = %d\n", i+1, x[i], y[i]); fprintf(R, "Temperatures on Day %d in 1930 = %d\t 2001 = %d\n", i+1, x[i], y[i]); } fclose(F); // 关闭输入文件 fclose(R); printf("\n"); // 计算均值 if (count == 0) { printf("No valid data read.\n"); return 1; } int sum1 = 0, sum2 = 0; for (int f = 0; f < count; f++) { sum1 += x[f]; sum2 += y[f]; } double mean1 = (double)sum1 / count; double mean2 = (double)sum2 / count; // 追加写入结果到文件 FILE *L = fopen("results.txt", "a"); if (L == NULL) { printf("Error: cannot open results.txt for append\n"); return 1; } printf("\nThe average temperature of 1930 is: %lf\nThe average temperature of 2001 is: %.4lf\n", mean1, mean2); fprintf(L, "\nThe average temperature of 1930 is: %lf\nThe average temperature of 2001 is: %.4lf\n", mean1, mean2); fclose(L); return 0; }
修复说明
- 移除了错误的
int **size变量,改用x和y数组完成数据存储与均值计算 - 新增
count变量记录实际读取的有效数据条数,避免硬编码导致的逻辑错误 - 统一了数组下标使用规则,避免未初始化值干扰计算
- 补充了所有文件操作的错误检查,防止空指针操作
- 修正了
main函数的标准声明,符合C语言规范 - 关闭了所有打开的文件,避免资源泄漏
内容的提问来源于stack exchange,提问作者Robert Westmeyer
相关产品推荐
相关产品推荐

