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
相关产品推荐
相关产品推荐

