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

C语言结构体代码的Segmentation Fault错误与scanf输入异常解决

C语言结构体数组操作问题解决

一、第一段代码的Segmentation Fault(段错误)问题

核心原因

段错误本质是访问了未分配/未初始化的内存,结合你使用gets的场景,大概率是两种情况:

  1. 声明了结构体指针数组(如struct Student *stu[N];)但未给每个指针分配内存,直接通过stu[i]->name访问属于野指针操作。
  2. gets会无限制读取输入直到换行,若输入长度超过结构体字符数组的定义长度,会触发内存越界,破坏程序内存空间。

修复方案

  • 放弃指针数组,直接使用结构体数组(无需手动分配内存):
    struct Student stu[5]; // 直接声明结构体数组,内存自动分配
    
  • 替换已被C标准废弃的不安全函数gets,改用fgets读取字符串(同时处理换行符):
    fgets(stu[i].name, sizeof(stu[i].name), stdin);
    // 手动去除fgets读取到的换行符
    stu[i].name[strcspn(stu[i].name, "\n")] = '\0';
    

二、第二段代码的scanf输入异常问题

核心原因

scanf("%s", ...)读取字符串时,会在遇到空白字符(空格/换行)时停止,但输入结束时的换行符会留在输入缓冲区。后续使用scanf("%d", ...)读取整数时,会直接读取缓冲区中的换行符,被视为无效输入,导致跳过用户输入直接执行下一轮循环。

修复方案

三种简单可行的解决方式:

  1. 在读取整数的scanf格式串前添加空格,自动跳过所有空白字符(包括换行):
    printf("Enter age: ");
    scanf(" %d", &stu[i].age); // 注意%d前的空格
    
  2. 每次读取字符串后,用getchar()清空缓冲区中的换行符:
    scanf("%s", stu[i].name);
    getchar(); // 吃掉缓冲区残留的换行符
    
  3. 统一用fgets读取所有输入,再通过sscanf转换格式(最安全,彻底避免缓冲区问题):
    char buf[32];
    printf("Enter name: ");
    fgets(stu[i].name, sizeof(stu[i].name), stdin);
    stu[i].name[strcspn(stu[i].name, "\n")] = '\0';
    
    printf("Enter age: ");
    fgets(buf, sizeof(buf), stdin);
    sscanf(buf, "%d", &stu[i].age); // 从缓冲区字符串中解析整数
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 01:42:19