C语言结构体代码的Segmentation Fault错误与scanf输入异常解决
C语言结构体数组操作问题解决
一、第一段代码的Segmentation Fault(段错误)问题
核心原因
段错误本质是访问了未分配/未初始化的内存,结合你使用gets的场景,大概率是两种情况:
- 声明了结构体指针数组(如
struct Student *stu[N];)但未给每个指针分配内存,直接通过stu[i]->name访问属于野指针操作。 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", ...)读取整数时,会直接读取缓冲区中的换行符,被视为无效输入,导致跳过用户输入直接执行下一轮循环。
修复方案
三种简单可行的解决方式:
- 在读取整数的
scanf格式串前添加空格,自动跳过所有空白字符(包括换行):printf("Enter age: "); scanf(" %d", &stu[i].age); // 注意%d前的空格 - 每次读取字符串后,用
getchar()清空缓冲区中的换行符:scanf("%s", stu[i].name); getchar(); // 吃掉缓冲区残留的换行符 - 统一用
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
相关产品推荐
相关产品推荐

