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

如何通过扫描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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 19:50:25