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

程序特定节点后printf失效,均值无法输出至命令行与文件

问题分析与修复方案

你的程序在读取完数据后直接崩溃,导致后续均值计算与输出代码完全无法执行,核心原因是非法内存访问,同时存在多处代码逻辑错误,以下是具体问题和修复步骤:

核心致命错误:size变量的误用

你定义了int **size;(二级指针),但却将fscanf的返回值(匹配成功的参数数量,是int类型)赋值给它,后续又尝试用size[f][0]访问二维数组——size从未指向任何有效内存空间,这种非法访问会直接触发内存错误,导致程序崩溃。

你实际应该用已经定义好的x和y数组来存储数据并计算均值,size变量完全是多余且错误的。

其他代码错误

  1. main函数声明不符合标准:C标准中main函数必须返回int类型,而非void main(void),需改为int main(void),并在函数末尾添加return 0;。
  2. scanf参数错误:scanf("%s", &Check);中Check是数组名,本身就是内存地址,无需加&,应改为scanf("%s", Check);。
  3. 数组下标逻辑混乱:读取数据时从i=1开始使用x[i]和y[i],但计算均值时循环从f=0开始,x[0]和y[0]未初始化,会引入垃圾值。
  4. 未关闭输入文件:读取完数据后未关闭F指针,会导致资源泄漏,需添加fclose(F);。
  5. 文件打开未做错误检查:打开results.txt时未判断是否成功,若文件无法打开会导致后续操作空指针,需增加if(R == NULL)的判断逻辑。
  6. 硬编码循环次数:数据是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 21:17:13