- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个关于将函数传递给另一个函数的问题,这两个函数都有结构作为参数。首先我创建了两个结构:
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 *)
会隐藏有关不兼容类型的警告。仅当您知道自己在做什么时才应该进行转换。在这个简单的程序中,您不需要强制转换。
在您的原始代码中,有关于“隐式声明”的警告。这些涉及您的 copy
和 length
函数。 (顺便问一下,strlen
和 strcpy
有什么问题吗?)您应该将这些函数移动到顶部,以便在调用它们之前声明它们。或者,在代码开头或头文件中提供原型(prototype),在顶部#include
中提供原型(prototype)。 (但是现在您读入了 PLAYER 结构,不再需要这些函数。)
关于具有指针元素和动态分配的 C 程序足球队结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28418536/
我是一名优秀的程序员,十分优秀!