如何在C中使用带结构的字符串?

时间:2015-01-08 01:13:27

标签: c

我已经看到了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);
}

3 个答案:

答案 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);
}