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

向结构体数组输入值时出现Segmentation fault错误求助

问题分析与修复方案

看起来你的程序踩了几个C语言文件操作和结构体使用的常见坑,才会出现垃圾值输出和段错误。咱们一步步拆解问题,然后给出修复方案:

1. 错误使用feof()作为循环终止条件

这是C语言新手常犯的错误!feof()并不会提前告诉你文件即将结束,它只会在已经尝试读取并失败之后才会返回非零值。你的循环会在文件读完之后多执行一次,这时候fscanf读取失败,结构体里的变量还是未初始化的垃圾值,直接输出就会出现乱码,甚至触发段错误。

2. 表头处理方式完全错误

你用if(i==0) i++;来跳过表头,但实际上这一步根本没读取表头的内容!表头的字符串还留在输入缓冲区里,第一次执行fscanf时,会尝试把字符串"ID"读取到整数类型的a[i].number里,这肯定会读取失败,导致后续所有结构体成员都是未初始化的垃圾值——这就是你看到那些奇怪数字的直接原因。

3. 未检查fopen()的返回值

如果grades.txt不存在、路径不对或者没有读取权限,fopen()会返回NULL。这时候你直接用fp1调用feof()、fscanf(),都会触发未定义行为,比如段错误。

4. printf输出参数顺序错误

你的printf语句里少了a[i].q[3],把a[i].q[3]的位置写成了a[i].total,就算读取正常,输出结果也会完全不对。


修复后的代码

#include <stdio.h>
#include <string.h>

// 把结构体typedef放在main外面,代码结构更清晰,也方便后续扩展
typedef struct {
    int number;
    int q[4];
    int total;
} student;

int main() {
    FILE *fp1 = fopen("grades.txt", "r");
    // 必须检查文件是否成功打开
    if (fp1 == NULL) {
        printf("无法打开grades.txt文件!\n");
        return 1;
    }

    int i = 0;
    student a[101];
    char header[100];
    // 用fgets读取整行表头并丢弃,避免干扰后续数据读取
    fgets(header, sizeof(header), fp1);

    // 用fscanf的返回值判断读取是否成功:成功读取6个参数才继续循环
    while (fscanf(fp1, "%d %d %d %d %d %d", 
                  &a[i].number, 
                  &a[i].q[0], &a[i].q[1], &a[i].q[2], &a[i].q[3], 
                  &a[i].total) == 6) {
        // 修正printf的输出参数,确保顺序和读取一致
        printf("%d %d %d %d %d %d\n", 
               a[i].number,
               a[i].q[0], a[i].q[1], a[i].q[2], a[i].q[3], 
               a[i].total);
        i++;
        // 防止数组越界,最多读取100个学生数据
        if (i >= 100) break;
    }

    fclose(fp1);
    return 0;
}

修复要点说明

  • 将结构体定义移到main函数外,符合C语言编码规范,代码结构更清晰。
  • 新增fopen返回值检查,避免文件打开失败时的未定义行为。
  • 用fgets读取表头并丢弃,确保后续fscanf能正确读取学生数据。
  • 改用fscanf的返回值(成功读取的参数个数)作为循环条件,读取失败或到文件末尾时直接终止循环,避免多读导致的问题。
  • 修正printf的输出参数顺序,同时增加数组越界检查,防止超过a[101]的容量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:46:35