C语言中如何向结构体中追加元素而不覆盖原有内容
解决两次调用随机函数填充结构体数组不覆盖的问题
嘿,我来帮你搞定这个问题!你的核心需求是两次调用rrandom函数,分别给buf数组的两个元素赋值,而且不会覆盖第一次的结果对吧?咱们先梳理原代码里的问题,再给出修正后的完整方案:
原代码的几个关键问题
rrandom函数没有正确接收buf参数,也没有指定要填充的元素位置,导致每次调用都会覆盖同一个位置- 没有初始化随机数种子,
rand()每次运行都会生成相同的序列 select数组定义为org select[size](size=4),但代码里访问了select[4],这是数组越界,会导致未定义行为rrandom内部的循环逻辑冗余,没必要用for(i=0; i<1; i++)
修正方案的核心思路
让rrandom函数接收两个额外参数:要填充的buf数组,以及要填充的buf元素索引(0或1)。这样每次调用时指定不同的索引,就能分别填充buf[0]和buf[1],不会互相覆盖。
完整修正后的代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> // 用于初始化随机数种子 #define size 4 typedef struct Org { int id[4]; char name[4][7]; } org; // 修正函数参数:接收select数组、buf数组、要填充的buf索引 void rrandom(org select[size], org buf[], int index) { int j; // 生成0-3的随机索引,对应select数组的元素 int r = rand() % 4; // 将select[r]的id复制到buf[index]的id数组 for(j = 0; j < 4; j++){ buf[index].id[j] = select[r].id[j]; } // 将select[r]的name复制到buf[index]的name数组 for(j = 0; j < 4; j++){ strcpy(buf[index].name[j], select[r].name[j]); } // 可选:打印当前填充的结果,方便调试 printf("=== 第%d次填充结果 ===\n", index+1); for(j = 0; j < 4; j++){ printf("bname %s bid = %d \n", buf[index].name[j], buf[index].id[j]); } } int main() { int i,j; org select[size]; org buf[2]; // 初始化随机数种子,确保每次运行随机结果不同 srand(time(NULL)); // 初始化select数组的name字段(修正了原代码的越界问题,select的索引是0-3) sprintf(select[0].name[0],"1ello1"); sprintf(select[0].name[1],"1ello2"); sprintf(select[0].name[2],"1ello3"); sprintf(select[0].name[3],"1ello4"); sprintf(select[1].name[0],"2ello1"); sprintf(select[1].name[1],"2ello2"); sprintf(select[1].name[2],"2ello3"); sprintf(select[1].name[3],"2ello4"); sprintf(select[2].name[0],"3ello1"); sprintf(select[2].name[1],"3ello2"); sprintf(select[2].name[2],"3ello3"); sprintf(select[2].name[3],"3ello4"); sprintf(select[3].name[0],"4ello1"); sprintf(select[3].name[1],"4ello2"); sprintf(select[3].name[2],"4ello3"); sprintf(select[3].name[3],"4ello4"); // 初始化select数组的id字段 printf("Initial id:\n"); for(i = 0; i < size; i++) { for(j = 0; j < 4; j++) { select[i].id[j] = j; printf("select[%d].id[%d] = %d\n", i, j, select[i].id[j]); } } // 第一次调用:填充buf[0] rrandom(select, buf, 0); // 第二次调用:填充buf[1] rrandom(select, buf, 1); // 从main函数打印最终的buf结果 printf("\n=== 最终buf数组结果 ===\n"); for (int i = 0; i < 2 ; i++){ printf("buf[%d]的内容:\n", i); for(int j = 0; j < 4; j++){ printf("bname %s bid = %d ", buf[i].name[j], buf[i].id[j]); } printf("\n\n"); } return 0; }
关键说明
- 函数参数设计:通过
int index参数指定要填充buf的哪个元素,第一次传0填充buf[0],第二次传1填充buf[1],完全避免覆盖 - 随机数种子初始化:
srand(time(NULL))用当前时间作为种子,保证每次运行程序的随机结果都不一样 - 数组越界修复:原代码中
select[4]是非法访问,因为select数组只有4个元素(索引0-3),所以删除了这部分错误代码 - 简化循环逻辑:去掉了原函数中冗余的
for(i=0; i<1; i++)循环,直接用传入的index操作buf数组
内容的提问来源于stack exchange,提问作者lena
相关产品推荐
相关产品推荐

