我已经看到了this question的答案,但对于像我这样的新手而言,这是非常缺乏信息,但仍然无法让它发挥作用。我试图声明一个名为“name”的结构的成员,它接受一个字符串值,然后试图弄清楚如何获取该值并打印它。我试过的每一种方式都会产生错误......
typedef struct {
float height;
int weight;
char name[];
} Person;
void calculateBMI(Person x) {
//printf will go here here
}
int main(int argc, const char * argv[]) {
Person Michael;
Michael.height = 62.0;
Michael.weight = 168;
Michael.name[] "Michael";
Person Steve;
Steve.height = 50.4;
Steve.weight = 190;
Steve.name = "Steven";
calculateBMI(Michael);
calculateBMI(Steve);
}
答案 0 :(得分:3)
您必须指定char数组的长度,如下所示:
typedef struct {
float height;
int weight;
char name[30];
} Person;
然后使用strcpy填充它:
int main(int argc, const char * argv[]) {
Person Michael;
Michael.height = 62.0;
Michael.weight = 168;
strcpy(Michael.name, "Michael");
Person Steve;
Steve.height = 50.4;
Steve.weight = 190;
strcpy(Steve.name, "Steven");
calculateBMI(Michael);
calculateBMI(Steve);
}
当您在声明类型为Person
的新变量时将空间分配到堆栈中时,此解决方案将是所有常见情况中最干净的解决方案。在大多数复杂场景中,您都不知道char数组的大小,也许您需要尽可能地保持它的大小。在这种情况下,您可以使用malloc
解决方案
请记住,每次使用malloc
时,您必须记住在完成数据后free
分配的空间。
答案 1 :(得分:1)
您可以将名称成员声明为char *
并分配空格以将字符串复制到其中
typedef struct {
float height;
int weight;
char *name;
} Person;
size_t length;
const char *name = "Michael";
length = strlen(name);
Michael.name = malloc(1 + length);
if (Michael.name != NULL)
strcpy(Michael.name, name);
然后当您使用struct
时,请不要忘记free
free(Michael.name);
或 HAL9000 建议,但此解决方案不适用于更长的字符串。
您可以通过创建辅助函数(如
)来简化此过程char *dupstr(const char *src)
{
char *dst;
size_t length;
if (src == NULL)
return NULL;
length = strlen(src);
dst = malloc(1 + length);
if (dst == NULL)
return NULL;
strcpy(dst, src);
return dst;
}
然后
typedef struct {
float height;
int weight;
char *name;
} Person;
Michael.name = dupstr("Michael");
但在完成结构使用后,您还需要调用free
。
答案 2 :(得分:0)
typedef struct {
float height;
int weight;
char name[];
} Person;
此结构没有为名称声明大小,这意味着在创建结构时,还必须为名称创建空间。
int main(int argc, const char * argv[])
{
Person *Michael=malloc(sizeof(Person)+strlen("Michael")+1);
if(!Michael)return 1;
Michael->height = 62.0;
Michael->weight = 168;
strcpy(Michael->name,"Michael");
calculateBMI(Michael);
free(Michael);
}