C - 当我尝试将结构从数组复制到结构中包含的数组时出现问题

Posted

技术标签:

【中文标题】C - 当我尝试将结构从数组复制到结构中包含的数组时出现问题【英文标题】:C - Problem when I try to copy a struct from an array to an array contained in a struct 【发布时间】:2021-09-05 12:56:37 【问题描述】:

好的,所以我有两个结构(玩家和团队),它们分别属于

typedef struct
    int matricola_squadra;
    int matricola_giocatore;
    char cognome[20];
    char nome[20];
    char ruolo[4];
    bool attivo;
calciatore;

typedef struct
    int matricola;
    char nome_squadra[30];
    calciatore giocatori_squadra[MAX_GIOCATORI];
    int punti;
    int vittorie;
    int sconfitte;
    bool turno_di_pausa;
squadra;

你可以很容易地看到结构'squadra'的第三个元素是'calciatori'的数组(MAX_GIOCATORI = 20);

我将 20 个“squadra”(团队)放在一个数组中,将 400 个玩家(20 x 团队)放在另一个数组中,每种类型都对应于各自的结构,这样:

squadre_in_array(file_squadre, array_squadre, numero_squadre);
calciatori_in_array(file_calciatori, array_calciatori, numero_calciatori);

'array_squadre' 和 'array_calciatori' 充满了正方形和 calciatori,当我尝试打印它们时,一切都以正确的方式进行。 squadra 的 'matricola' 和 calciatore 的 'matricola_squadra' 包含一个我想用来匹配它们并移动 struct Squadra 中包含的 struct 数组中通过匹配的 20 名玩家。来了……

这是我的功能:

void calciatori_in_squadra(calciatore arcalc[], int maxcalcsqua, squadra arsqua[], int nsqua)
    for (int i = 0; i < nsqua; i++)
        for (int j = 0; j < maxcalcsqua*nsqua; j++)
            if (arsqua[i].matricola == arcalc[j].matricola_squadra )
                arsqua[i].giocatori_squadra[j].matricola_squadra = arcalc[j].matricola_squadra;
                arsqua[i].giocatori_squadra[j].matricola_giocatore = arcalc[j].matricola_giocatore;
                strcpy(arsqua[i].giocatori_squadra[j].nome, arcalc[j].nome);
                strcpy(arsqua[i].giocatori_squadra[j].cognome, arcalc[j].cognome);
                printf("Squadra: %20s - Nome: %20s\n", arsqua[i].nome_squadra, arsqua[i].giocatori_squadra[j].nome);
            
        
    

nsqua 是小队的数量 (20),而 maxcalcsqua 是团队中的最大玩家人数。 在这一行中,我进行了比较,如果squadra (matricola) 的id 和calciatore (matricola_squadra) 的id 匹配,它就会复制。

当我的程序(我在调试时看到它)将一个 id 转换为另一个随机数(idk 为什么)时,问题出现在我的第 4 次迭代中,有时它会在未对其进行任何操作时更改“squadra”的名称。 ..我要疯了

id 的类型为:

234859;Casper Team
234860;Logic Nation
234861;Boolean Choose
234862;FC Integer
234863;Majin Boo
234864;Vedinet Master
...

为团队和

234859;1;adaffwf;sgrwgwe;POR
234859;2;uyftfdgou;agsrgr;POR
234859;3;jfkdjgvfjd;greghhjejt;POR
234859;4;gfkjdzi;rgeg;DIF
234859;5;jgfidjzgop;agrrge;DIF
234859;6;jgfodpzj;gegrea;DIF
234859;7;jippp;aagrger;DIF
234859;8;nnndjhs;jkuyk;DIF
234859;9;qefsev;uykjr;DIF
234859;10;astgegbf;jkuyk;CEN
234859;11;befis;therg;CEN
234859;12;trisfbhs;erghejt;CEN
234859;13;gruidshfi;rjkw;CEN
234859;14;dnjsfhsj;hbe;CEN
234859;15;loejskfpo;behwjh;CEN
234859;16;jzshxd;wrtj;ATT
234859;17;ahiuoho;rtj;ATT
234859;18;pikop;rjtwrtjrtj;ATT
234859;19;huohdso;rwj;ATT
234859;20;opasidp;rjtjrtj;ATT
234860;21;akjdsopfksdop;qerbvrg;POR
234860;22;fsdopf;rjn;POR
234860;23;dsofdso;k;POR
234860;24;fdosf;ku;DIF
... (20 with the same team id to do the match correctly)

给玩家

例如,我的程序将 197162 放入团队的 .matricola 中,并以 234862 作为 id... 我知道这是很多代码,我确信问题出在函数中,程序的其余部分运行良好,我做了检查......也许这是一个内存问题,但我不确定。 感谢您的帮助!

【问题讨论】:

如果j 上升到maxcalcsqua*nsqua-1,似乎j&gt;=MAX_GIOCATORI,这意味着arsqua[i].giocatori_squadra[j] 不好。 你为什么要乘以maxcalcsqua*nsqua 因为我有 20 名球员和 20 支球队,所以我使用 j 直到 400(球员的完整列表)来检查所有列表中是否有匹配 【参考方案1】:

好的,我使用这个简单的代码轻松解决了我的问题,问题出在 j 迭代器中..

void calciatori_in_squadra(calciatore arcalc[], int maxcalcsqua, squadra arsqua[], int nsqua)
    int i, j;
    for(i = 0; i < nsqua; i++)
        for( j = i*MAX_GIOCATORI; j < (MAX_GIOCATORI*(i+1)); j++ )
            int x = 0;
            if (arsqua[i].matricola == arcalc[j].matricola_squadra)
                arsqua[i].giocatori_squadra[x] = arcalc[j];
                x++;
            
        
    

回顾一下,一个由 20 名球员 (x couter (0 到 19)) 组成的数组,将 20 名球员 (j (0 到 19 - 20 到 39 等)) 放入 20 支球队 (i 0 到 20),限制是我无法扫描整个阵列(400)或出现一些错误!但是我很擅长这个

【讨论】:

以上是关于C - 当我尝试将结构从数组复制到结构中包含的数组时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

关于C中的结构,如何将数据从结构复制到字符串数组

将字符串从main复制到结构c

golang 数组

无法将固定大小的字节数组从结构复制到 C# 结构中的另一个数组

将元素中包含的内容与数组一起添加

如何将 simulink 中的数组结构提供给自定义 C 代码函数?