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

函数中使用fscanf遇问题:程序崩溃或仅存储首字符

解决C语言文件读取函数崩溃与数组仅存首字符的问题

问题根源:函数参数类型不匹配

你定义的hurricanes和states是二维字符数组(char[NUM_HURRICANES][100]和char[NUM_HURRICANES][5]),但file_handling函数的形参却声明为char *hurricanes和char *states,这直接导致两个问题:

  • 最初使用hurricanes[i]时,编译器会将其解析为单个char类型,而fscanf的%s需要char*类型参数,类型不匹配触发非法内存访问,程序崩溃。
  • 改为&hurricanes[i]后,虽然类型转为char*,但此时指向的是单个字符的地址,fscanf写入时只会把字符串首字符存在该位置,后续字符越界写入,最终表现为数组仅存首字符。

正确的函数参数声明

将函数参数改为与实参匹配的二维数组类型,有两种等效写法:

  1. 直接声明二维数组(需指定第二维大小,与实参一致):
    void file_handling(int *years, char hurricanes[NUM_HURRICANES][100], char states[NUM_HURRICANES][5])
    
  2. 使用指向一维数组的指针:
    void file_handling(int *years, char (*hurricanes)[100], char (*states)[5])
    

修正后的完整函数代码

同时补充文件打开失败的退出逻辑,避免空指针操作;添加fscanf返回值检查,及时发现读取错误:

#define NUM_HURRICANES 10 // 根据你的实际定义调整宏值

int years[NUM_HURRICANES] = {0};
char hurricanes[NUM_HURRICANES][100] = {0},
     states[NUM_HURRICANES][5] = {0};

void file_handling(int *years, char hurricanes[NUM_HURRICANES][100], char states[NUM_HURRICANES][5])
{
    FILE *file_ptr = fopen("hurricanes.txt", "r");
    if (file_ptr == NULL) {
        puts("File not found.");
        return; // 文件打开失败,直接返回避免后续错误操作
    }
    puts("File found.");

    for(int i = 0; i < NUM_HURRICANES; i++) {
        // 检查读取是否成功,确保每次读取到3个数据
        if (fscanf(file_ptr, "%d %s %s", &years[i], hurricanes[i], states[i]) != 3) {
            puts("读取数据出错或文件内容不足");
            break;
        }
    }

    fclose(file_ptr);
}

补充说明

  • 二维字符数组的hurricanes[i]本身就是指向第i个字符串首地址的char*,无需加&,直接传给fscanf的%s即可。
  • 检查fscanf返回值能及时发现文件格式不匹配、内容行数不足等问题,避免后续逻辑基于错误数据执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 21:52:41