gpt4 book ai didi

具有指针元素和动态分配的 C 程序足球队结构

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

我有一个关于将函数传递给另一个函数的问题,这两个函数都有结构作为参数。首先我创建了两个结构:

typedef struct
{
char name[25],surname[25];int number;
}PLAYER;

typedef struct
{
char nameofteam[25];int numberofplayers;char *players;
}TEAM;

然后我定义了一个函数来读取一个玩家的元素:

void readplayer(PLAYER *);
void readplayer(PLAYER *pi)
{
printf("name:");scanf("%s",pi->name);
printf("surname:");scanf("%s",pi->surname);
printf("number of player:");scanf("%d",&pi->number);
}

我的问题是如何创建原型(prototype)为 void readteam(TEAM*) 的函数它将读取一个团队的数据,但使用函数 readplayer并调用 main() ?这是我尝试过的:

#include<stdio.h>
#include<stdlib.h>
typedef struct
{
char name[25],surname[25];int number;
}PLAYER;

typedef struct
{
char nameofteam[25];int numberofplayers;char *players;
}TEAM;
void readplayer(PLAYER *pi)
{
printf("name:");scanf("%s",pi->name);
printf("surname:");scanf("%s",pi->surname);
printf("number of player:");scanf("%d",&pi->number);
}
void readteam(TEAM *pt)
{
char players[101];int i;
printf("name of team:");scanf("%s",pt->nameofteam);
printf("number of players in team:");scanf("%d",&pt->numberofplayers);
printf("players:");scanf("%s",players);
pt->players=(char *)calloc(length(players)+1,sizeof(char));
copy(pt->players,players);
for(i=0;i<pt->numberofplayers;i++)
{
printf("%d.",i+1);
readplayer(pt+i);
}
}
void erase(TEAM *);
void erase(TEAM *pt)
{
free(pt->players);
}
int length(char *s)
{
int d=-1;
while(s[++d]);
return d;
}

void copy(char *s1,char *s2)
{
while(*s1++ = *s2++);
}
int main()
{
int i,n;
TEAM *p;
do
{
printf("n=");scanf("%d",&n);
}
while(n<1);
p=(TEAM *)malloc(n * sizeof(TEAM));
for(i=0;i<n;i++)
{
printf("%d.",i+1);readteam(p+i);
}
free(p);
}

这在最后一次输入时给我一个错误(在编译中,而不是调试中)。一定是因为动态分配使用不当。我没有使用<string.h图书馆。显然,只有readteam函数必须位于 main() 中.

感谢您的回答。

最佳答案

您对如何存储播放器感到困惑。您已经创建了一个 PLAYER 结构,但您从未使用过它。相反,您坚持玩家必须是单个字符串。

但它应该像这样工作:您有 n 个团队。 Ecah 团队有 m 名队员。所有团队信息都存储在您的“TEAM”结构中。所有玩家信息都存储在您的PLAYER结构中。因为团队是由玩家组成的,所以您的结构中应该有一个 PLAYER` 条目:

typedef struct {
char name[25];
char surname[25];
int number;
} PLAYER;

typedef struct {
char nameofteam[25];
int numberofplayers;
PLAYER *players;
} TEAM;

然后,当您读取球员时,您会读取 readteam 中的裸球队信息。但您不会在那里读取有关单个玩家的任何信息,因为您将其委托(delegate)给 readplayer。当然,您传递给该函数的指针必须是针对一名球员的,而不是针对一支球队的:

void readplayer(PLAYER * pi)
{
printf("name:");
scanf("%s", pi->name);
printf("surname:");
scanf("%s", pi->surname);
printf("number of player:");
scanf("%d", &pi->number);
}

void readteam(TEAM * pt)
{
int i;

printf("name of team:");
scanf("%s", pt->nameofteam);
printf("number of players in team:");
scanf("%d", &pt->numberofplayers);

pt->players = calloc(pt->numberofplayers, sizeof(*pt->players));

for (i = 0; i < pt->numberofplayers; i++) {
printf("Player %d:\n", i + 1);
readplayer(pt->players + i);
}
}

转换为 (char *) 会隐藏有关不兼容类型的警告。仅当您知道自己在做什么时才应该进行转换。在这个简单的程序中,您不需要强制转换。

在您的原始代码中,有关于“隐式声明”的警告。这些涉及您的 copylength 函数。 (顺便问一下,strlenstrcpy 有什么问题吗?)您应该将这些函数移动到顶部,以便在调用它们之前声明它们。或者,在代码开头或头文件中提供原型(prototype),在顶部#include 中提供原型(prototype)。 (但是现在您读入了 PLAYER 结构,不再需要这些函数。)

关于具有指针元素和动态分配的 C 程序足球队结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28418536/

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