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

C语言用指针数组实现文件读写时printf失效、输出文件为空问题

问题原因

  • 核心错误:char *name[5]定义的是长度为5的字符指针数组,所有指针未初始化分配内存,直接通过fscanf()向野指针指向的地址写入数据属于未定义行为,会触发程序崩溃、输出异常、写入内容为空等随机问题。
  • 语法错误:fscanf()读取字符串时传入&name[i]参数错误,name[i]本身就是指针类型,无需额外取址。
  • 容错缺失:未对fopen()的返回值做非空判断,若data.txt不存在、路径错误或无读取权限,后续所有读写操作都会失效。

修改方案

将字符指针数组替换为固定长度的二维字符数组,自动分配栈内存存储字符串,修正fscanf()传参逻辑,新增文件打开成功校验。
修改后的完整代码如下:

#include<stdio.h>
#include<math.h>

int main()
{
    FILE *fr, *fw;
    fr = fopen("data.txt", "r");
    // 新增文件打开失败判断
    if(fr == NULL) {
        printf("data.txt打开失败,请检查文件路径和权限");
        return 1;
    }
    float wt[10], ht[10], bmi[10];
    // 修改为二维字符数组,每个名字最多存储19个字符
    char name[5][20];
    for(int i = 0; i < 5; i++)
    {
        // 修正字符串传参,无需取址
        fscanf(fr, "%s %f %f", name[i], &wt[i], &ht[i]);
        bmi[i] = wt[i] / pow(ht[i], 2);
    }
    printf("%s", name[2]);
    fw = fopen("bmi.txt", "w");
    if(fw == NULL) {
        printf("bmi.txt创建失败,请检查写入权限");
        fclose(fr);
        return 1;
    }
    for(int j = 0; j < 5; j++)
    {
        fprintf(fw, "%s %f\n", name[j], bmi[j]);
    }
    fclose(fr);
    fclose(fw);
    return 0;
}

内容的提问来源于stack exchange,提问作者muntasin_22

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 01:30:01