如何通过扫描stdin为结构体字段赋值?代码赋值失败求助
代码问题分析与修复方案
原代码核心问题
- 野指针未分配内存:
name2、number2等指针未指向有效内存区域,直接用fgets/scanf写入会触发内存访问错误,属于未定义行为。 - 冗余且错误的内存分配:
corona是静态数组,数组内每个Corona结构体已自动分配栈内存,malloc操作完全多余且语法错误。 - 结构体赋值方式非法:
corona[0]={{("%s",name2),("%s", number2)}, {("%s", location2),("%s", date2)}};这种写法不符合C语言语法,无法完成字符串赋值。 - 输入流残留问题:
fgets读取姓名后,输入缓冲区会遗留换行符,可能干扰后续scanf的输入解析。
修复后的代码
#include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct { char name[100]; char phone[100]; } Person; typedef struct { char location[100]; char time[100]; } Event; typedef struct { Person person; Event event; } Corona; int main() { Corona corona[28]; // 静态数组,元素自动分配栈内存 // 读取姓名到结构体成员 printf("请输入姓名:"); fgets(corona[0].person.name, sizeof(corona[0].person.name), stdin); // 移除fgets读取到的换行符 size_t name_len = strlen(corona[0].person.name); if (name_len > 0 && corona[0].person.name[name_len - 1] == '\n') { corona[0].person.name[name_len - 1] = '\0'; } // 读取手机号、地点、时间到对应结构体成员 printf("请输入手机号、地点、时间(用空格分隔):"); scanf("%s %s %s", corona[0].person.phone, corona[0].event.location, corona[0].event.time); // 打印录入信息 printf("\n录入信息如下:\n"); printf("姓名:%s\n", corona[0].person.name); printf("手机号:%s\n", corona[0].person.phone); printf("地点:%s\n", corona[0].event.location); printf("时间:%s\n", corona[0].event.time); return 0; }
关键修改说明
- 直接绑定输入到结构体:省去中间指针变量,将输入直接写入
corona[0]的对应成员,避免野指针问题。 - 处理换行符:手动移除
fgets读取的换行符,保证打印结果整洁。 - 简化内存逻辑:利用静态数组的自动内存分配,删除冗余的
malloc操作。 - 合法赋值逻辑:通过
fgets/scanf直接完成结构体成员的赋值,符合C语言语法规范。
内容的提问来源于stack exchange,提问作者stomexone
相关产品推荐
相关产品推荐

