gpt4 book ai didi

c - 在 C 中传递结构的正确方法

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

我是编程初学者,这是我第一次来这里。我需要你的帮助来解决这个问题..

现在,我要解决的是编写一段代码,打印出球队中足球运动员的信息和属性。这是一个例子..

enter image description here

这是著名足球运动员莱昂内尔·梅西(Lionel Messi)..正如你在右上角看到的那样,这是他的属性,每个球员都有3类属性..技术属性、心理属性和 body 属性。每个属性的最大评分为 20。

现在我用两种方式编码,我不知道哪一种是正确的方式,或者两种方式是否都是错误的和糟糕的编程..

第一种方式:

#include <stdio.h>
#include <string.h>
void Messi ();
int main()
{
Messi();
return 0;
}

void Messi ()
{
struct player10
{
char technical[150];
char mental[150];
char physical[150];
};

struct player10 messi;

strcpy(messi.technical, "Corners: 14\nCrossing: 15\nDribbling: 20\nFinishing: 20\nFirst Touch: 20\nFree Kick: 15\nHeading: 12\nLong shots: 17\nPassing: 19\nPenalty Taking: 18\nTechnique: 20\n");

strcpy(messi.mental, "Agression: 7\nAnticipation: 19\nBravery: 7\nComposure: 19\nConsentration: 14\nDecisions: 19\nDetermination: 20\nFlair: 20\nLeadership: 14\nOff The Ball: 18\nTeamWork: 13\nVision: 20\nWork Rate: 7\n");

printf("Messi Technical:\n%s \t Messi Mental:\n%s",messi.technical,messi.mental);

return;
}

第二种方式:-

#include <stdio.h>
#include <string.h>


struct player10
{
char technical[150];
char mental[150];
char physical[150];
};


int main()
{
struct player10 messi;
printf("Messi Attributes: \n");
Messi_attr(messi);
return 0;
}


int Messi_attr (struct player10 messi)
{
strcpy(messi.technical,"Corners: 14\nCrossing: 15\nDribbling: 20\nFinishing: 20\nFirst Touch: 20\nFree Kick: 15\nHeading: 12\nLong shots: 17\nPassing: 19\nPenalty Taking: 18\nTechnique: 20\n");

printf("\nTechnical Attributes:\n\n%s", messi.technical);

strcpy(messi.mental,"Agression: 7\nAnticipation: 19\nBravery: 7\nComposure: 19\nConsentration: 14\nDecisions: 19\nDetermination: 20\nFlair: 20\nLeadership: 14\nOff The Ball: 18\nTeamWork: 13\nVision: 20\nWork Rate: 7\n");

printf("\nMental Attributes:\n\n%s", messi.mental);

strcpy(messi.physical,"Acceleration: 18\nAgility: 20\nBalance: 17\nJumping Reach: 6\nNatural Fitness: 14\nPace: 15\nStamina: 13\nStrength: 8\n");

printf("\nPhysical Attributes:\n\n%s", messi.physical);

return 0;
}

我做得对吗?或者有一种更简单的方法可以通过传递结构来对此进行编码?任何帮助将不胜感激..

最佳答案

您可以通过指针player10结构传递到函数中,以便用所需的字符串填充。在 c 中,将传入的对象作为可选是一种相当常见的模式,因此它不会强制程序使用堆。如果您传递 NULL,那么它会分配它返回的内容,因此您需要释放结果。

您可以创建一组以 player_ 为前缀的函数(或者 player10_ 如果您愿意的话,我没有明白 10 的含义) ,它对播放器进行操作并对其进行某种程度的封装。下面我展示了 player_create (它实际上是构造函数)和 player_print 来打印所有玩家。

这里的例子希望对您有所帮助。我还展示了如何在没有现有播放器 struct 的情况下使用它。

#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define FIELD_SIZE 150

typedef struct
{
char technical[FIELD_SIZE];
char mental[FIELD_SIZE];
char physical[FIELD_SIZE];
} player10;

char* sstrncpy(char* dest, char* src, size_t destsize){

dest[destsize - 1] = '\0';
return strncpy(dest, src, destsize - 1);
}

player10* player_create(player10* p, char* tech, char* mental, char* physical)
{
if(!p){
p = malloc(sizeof(player10));
assert(p);
}

sstrncpy(p->technical, tech, FIELD_SIZE);
sstrncpy(p->mental, mental, FIELD_SIZE);
sstrncpy(p->physical, physical, FIELD_SIZE);

return p;
}

void player_print(player10* p)
{
printf("technical: %s\n", p->technical);
printf("mental: %s\n", p->mental);
printf("physical: %s\n", p->physical);
}

int main()
{
player10 messi;

// some like to reset their structs
//memset(&messi, 0, sizeof(player10));

player_create(&messi,
"Corners: 14\nCrossing: 15\nDribbling: 20\nFinishing: 20\nFirst Touch: 20\nFree Kick: 15\nHeading: 12\nLong shots: 17\nPassing: 19\nPenalty Taking: 18\nTechnique: 20\n",
"Agression: 7\nAnticipation: 19\nBravery: 7\nComposure: 19\nConsentration: 14\nDecisions: 19\nDetermination: 20\nFlair: 20\nLeadership: 14\nOff The Ball: 18\nTeamWork: 13\nVision: 20\nWork Rate: 7\n",
"Acceleration: 18\nAgility: 20\nBalance: 17\nJumping Reach: 6\nNatural Fitness: 14\nPace: 15\nStamina: 13\nStrength: 8\n");

printf("Messi Attributes: \n");
player_print(&messi);

player10* ronaldo = player_create(NULL, "stuff", "stuff", "stuff");

printf("Ronaldo Attributes: \n");
player_print(ronaldo);
free(ronaldo);

return 0;
}

如果您打算对这些 player10 结构进行大量操作,我建议您以不同的方式存储参数。您也许应该拥有包含数字字段的子结构technicalmentalphysical。这样,您的数据更易于查询,占用的空间更少,并且您可以避免字符串缓冲区大小和复制字符串等问题。

关于c - 在 C 中传递结构的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42215670/

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