gpt4 book ai didi

c - 如何使用结构体数组来创建玩家列表?

转载 作者:行者123 更新时间:2023-11-30 16:08:16 24 4
gpt4 key购买 nike

我是结构新手。我正在制作一个程序,我想在其中建立一个带有 structs 的玩家列表。这是我到现在为止写的。这是意大利语。但基本上,当我只插入一名玩家时,程序运行良好。当我想添加多个时却不会。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 25

struct rol{
int position[3];
int lato[1];
};
typedef struct rol role;

struct pl{
role *ruol;
int shirt_num;
char name[20];
char lastn[20];
};
typedef struct pl player;

struct tm{
int classpos;
int pnt;
player players[MAX];
};


typedef struct tm team;

void define_role (role *ruolo);
void make_pl(player *pl);

int main(int argc, char** argv) {
int risp;
player *giocatore;
int cont;
printf("Vuoi effettuare lavori su un giocatore o su una squadra ? \n [ 1) giocatore 2) squadra] ");
scanf("%d",&risp);
if(risp==1){
printf("\n\n1)Crea Giocatore \n 2)Modifica giocatore \n3)Inserisci giocatore in una squadra");
printf("\n 4)Visualizza dati giocatore \n ");
scanf("%d",&risp);
if(risp==1){
cont++;

giocatore = (player*)malloc (cont*sizeof(player));
make_pl(&giocatore[cont-1]); //this is the main problem basically
}
}
return 0;
}

void make_pl(player *pl){
printf("\n Inserisci nome ");
scanf("%s",pl->name);
printf("\n Inserisci cognome ");
scanf("%s",pl->lastn);
define_role(pl->ruol);
printf("Inserisci numero di maglia ");
scanf("%d",&pl->shirt_num);
}

void define_role(role *ruolo){
printf("\n Inserisci lato ");
scanf("%d",&ruolo->lato);
printf("\n Inserisci posizione ");
scanf("%d",&ruolo->position);

}

我使用常量 cont =1 运行,它的工作原理很明显。当我升级该值时,因为我想在它进入函数定义角色时添加一个新玩家,它会在第一次 scanf 之后阻塞。

scanf("%d",&ruolo->lato);

它说退出错误 bla bla bla。

我只是想列出一份具有技术特点的球员名单。我不知道出了什么问题。当我构建时,它没有给我任何错误。

最佳答案

我检查了您的代码,发现了一些问题,当您使用 scanf() 时,此函数会读取输入中的每个字符,直到找到空格,但不会读取换行符,因此,您需要清理输入或仅在格式化字符串之前添加一个空格:scanf("%d", &somVariable);。您需要将内存分配给结构体player内部的结构体role,这样在函数define_role中就不会出现段错误,您还需要为“cont”变量添加一个值。我对代码进行了更正,并添加了一段时间来添加更多玩家。

已编辑

我读了你的评论,我没有注意到 make_pl(&giocatore[cont-1]); 你将 gicatore 视为一个数组,但它是玩家的指针结构,因此当您尝试添加第二个玩家时,程序会以错误结束。因此,解决方案是创建一个数组或链表来保存您添加的玩家。数组的主要问题是,您只能添加特定数量的玩家,如果您尝试超过该限制,程序将以错误结束,因此我建议您使用链表。

我将 scanf("%d",&ruolo->lato[index]) 设置为 0,因为 lato 是结构体角色中包含一个 int 的数组,您可以声明一个 int 而不是一个数组只有一个 int,因此要访问数组的第一个元素,您需要将索引设置为 0,如果您写入,例如 120,该数字将保存在 lato[0] 中

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 25

struct rol{
int position[3];
int lato[1];
};
typedef struct rol role;

struct pl{
role *ruol;
int shirt_num;
char name[20];
char lastn[20];
};
typedef struct pl player;

struct tm{
int classpos;
int pnt;
player players[MAX];
};


typedef struct tm team;

void define_role (role *ruolo);
void make_pl(player *pl);

int main(int argc, char** argv) {
int risp;
player *giocatore;
player players[MAX];
int cont = 0;
printf("Vuoi effettuare lavori su un giocatore o su una squadra ? \n [ 1) giocatore 2) squadra] ");
scanf(" %d",&risp);

if(risp==1) {
do {
printf("\n\n1)Crea Giocatore\n2)Modifica giocatore\n3)Inserisci giocatore in una squadra");
printf("\n4)Visualizza dati giocatore\n 5) Finish program\n");
scanf(" %d",&risp);
if(risp==1) {
cont++;
giocatore = (player*)malloc (cont*sizeof(player));
giocatore->ruol = (role*)malloc(sizeof(role));
make_pl(giocatore); //this is the main problem basically
players[cont-1] = *giocatore;
}
} while(risp != 5);
}
return 0;
}

void make_pl(player *pl) {
printf("\n Inserisci nome ");
scanf(" %s",pl->name);
printf("\n Inserisci cognome ");
scanf(" %s",pl->lastn);
define_role(pl->ruol);
printf("Inserisci numero di maglia ");
scanf(" %d",&pl->shirt_num);
}

void define_role(role *ruolo) {
printf("\n Inserisci lato ");
scanf(" %d",&ruolo->lato[0]);
printf("\n Inserisci posizione ");
scanf(" %d",&ruolo->position[0]);
}

关于c - 如何使用结构体数组来创建玩家列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59414638/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com