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

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;
}

关键说明

  1. 函数参数设计:通过int index参数指定要填充buf的哪个元素,第一次传0填充buf[0],第二次传1填充buf[1],完全避免覆盖
  2. 随机数种子初始化:srand(time(NULL))用当前时间作为种子,保证每次运行程序的随机结果都不一样
  3. 数组越界修复:原代码中select[4]是非法访问,因为select数组只有4个元素(索引0-3),所以删除了这部分错误代码
  4. 简化循环逻辑:去掉了原函数中冗余的for(i=0; i<1; i++)循环,直接用传入的index操作buf数组

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:03:58