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

C语言从文件读取数据到football_player结构体时出现字符溢出问题求助

问题根源与解决方案

你的问题核心在于C语言字符串的结束符空间未预留,导致内存越界,破坏了相邻字段的数据。让我一步步拆解问题并给出修复方案:

1. 结构体字符数组长度的核心问题

C语言中,字符串必须以'\0'(空字符)作为结束标志。如果你的字段需要存储N个可见字符,对应的字符数组长度至少要设置为N+1,才能容纳字符本身和结束符。

看你的结构体定义:

  • char id[2]; 要存储"01"(2个字符),但数组长度只有2,没有空间放'\0'。当fscanf写入时,会越界写入到相邻的id_team数组空间,导致两个字段的数据混在一起。
  • char id_team[2]; 同样的问题,越界后会覆盖后面的nombre字段内容。
  • char id_plantilla[3]; 要存储"001"(3个字符),也需要4个长度的数组才能放下结束符。

2. 修改后的结构体定义

把所有字符数组的长度调整为「需要存储的字符数+1」:

typedef struct{
    char id[3];       // 存"01" + '\0',共3个空间
    char id_team[3];  // 存"02" + '\0',共3个空间
    char nombre[21];  // 原20个字符的上限,加结束符需要21个空间
    int precio;
    int valoracion;
    char id_plantilla[4]; // 存"001" + '\0',共4个空间
}football_player;

3. 可选:用fscanf格式限定符强化安全

为了避免读取时意外超出数组容量,可以在%s前加上长度限定,比如读取id时用%2s,表示最多读取2个字符(自动在末尾加'\0')。修改后的读取代码:

for (int i = 0; i < configuration.football_player_counter; ++i) {
    fscanf(players_file,"%2s",jugadores[i].id);          // 最多读2个字符到id
    fscanf(players_file,"%2s",jugadores[i].id_team);     // 最多读2个字符到id_team
    fscanf(players_file,"%20s",jugadores[i].nombre);     // 最多读20个字符到nombre
    fscanf(players_file,"%3s",jugadores[i].id_plantilla);// 最多读3个字符到id_plantilla
    fscanf(players_file,"%d",&jugadores[i].precio);
    fscanf(players_file,"%d",&jugadores[i].valoracion);
}

4. 额外建议

编译代码时开启警告(比如GCC的-Wall参数),这类内存越界的问题,编译器通常会提前给出提示,帮助你更早发现问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 09:27:33