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

标签 c

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

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/

相关文章:

c - 棘手的指针问题

c - 在 Linux 中生成鼠标滚动事件

c++ - 重负载下 C/C++ 中的内存泄漏检查

c - 如何让 C 编译器打印\n

C++打印两个标志

c - 如何一起处理位域和 qsorting?

c - Visual Studio 2008 调试大型 c 文件

c - C 中的 free 和 C++ 中的 delete 之间的区别?

c - 将一个字符串数组分配给另一个字符串数组

c - 获取 const void 的内容