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

如何从read_text函数中获取所有contact_t结构体数据?

问题分析与解决方案

你的问题核心是没有用数组存储多个结构体实例,大概率是在read_text里反复复用同一个结构体变量,导致新数据不断覆盖旧数据,最终只保留了最后一组信息。结合作业限制(不能用动态内存、文件操作函数),用固定大小的结构体数组+指针传递就能解决。

具体实现步骤

  1. 定义结构体与常量:明确结构体字段,用常量固定联系人数量(3个),避免魔法数字。
  2. 在main中创建结构体数组:直接声明contact_t contacts[CONTACT_COUNT],属于静态内存分配,符合作业要求。
  3. 传递数组指针给读取函数:把数组名(会自动退化为首元素指针)传给read_text,让函数能直接操作数组里的每个结构体。
  4. 循环读取并赋值:在read_text里循环3次,每次读取两行输入,分别赋值给对应索引的结构体字段,同时处理fgets读取到的换行符。

完整示例代码

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

#define CONTACT_COUNT 3
#define MAX_LINE_LEN 100

typedef struct {
    char name[MAX_LINE_LEN];
    char number[MAX_LINE_LEN];
} contact_t;

// 读取函数:接收结构体数组指针,填充数据
void read_text(contact_t *contacts) {
    for (int i = 0; i < CONTACT_COUNT; i++) {
        // 读取姓名(第1、3、5行)
        fgets(contacts[i].name, MAX_LINE_LEN, stdin);
        // 替换换行符为字符串结束符
        contacts[i].name[strcspn(contacts[i].name, "\n")] = '\0';
        
        // 读取号码(第2、4、6行)
        fgets(contacts[i].number, MAX_LINE_LEN, stdin);
        contacts[i].number[strcspn(contacts[i].number, "\n")] = '\0';
    }
}

int main() {
    contact_t contacts[CONTACT_COUNT];
    read_text(contacts);
    
    // 验证所有结构体数据
    for (int i = 0; i < CONTACT_COUNT; i++) {
        printf("联系人%d:姓名=%s,号码=%s\n", i+1, contacts[i].name, contacts[i].number);
    }
    return 0;
}

关键注意点

  • 数组传递逻辑:contact_t *contacts接收的是结构体数组的首地址,通过contacts[i]可直接访问第i个结构体,不会出现数据覆盖问题。
  • 换行符处理:strcspn函数能快速定位换行符位置,替换为'\0'避免字符串带换行符影响后续使用。
  • 符合作业限制:全程用静态数组(无动态内存分配)、fgets从标准输入读取(未使用fscanf/fopen),完全满足要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:25:22