如何从read_text函数中获取所有contact_t结构体数据?
问题分析与解决方案
你的问题核心是没有用数组存储多个结构体实例,大概率是在read_text里反复复用同一个结构体变量,导致新数据不断覆盖旧数据,最终只保留了最后一组信息。结合作业限制(不能用动态内存、文件操作函数),用固定大小的结构体数组+指针传递就能解决。
具体实现步骤
- 定义结构体与常量:明确结构体字段,用常量固定联系人数量(3个),避免魔法数字。
- 在main中创建结构体数组:直接声明
contact_t contacts[CONTACT_COUNT],属于静态内存分配,符合作业要求。 - 传递数组指针给读取函数:把数组名(会自动退化为首元素指针)传给
read_text,让函数能直接操作数组里的每个结构体。 - 循环读取并赋值:在
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
相关产品推荐
相关产品推荐

