scanf字符串以构造char指针

问题描述 投票:-1回答:1
typedef struct Std{
    char* name;
    char* surname;
    int yearOfBirth;
} Std;
[...]
Std* obj = (Std*)calloc(1, sizeof(Std));
scanf("%s", obj->name);
scanf("%s", obj->surname);
scanf("%d", obj->yearOfBirth);

不工作。如何使scanf将字符串保存到结构的字段中?

c scanf
1个回答
1
投票

使用calloc (),您为obj分配了Std结构所需的存储空间。但是通过此操作,您不会分配它包含的两个char *指针:namesurname

使用scanf访问它们意味着写入未定义的位置,这可能会导致分段错误。

因此,只需malloc ()给他们足够的空间即可包含名称和姓氏:

typedef struct Std{
    char* name;
    char* surname;
    int yearOfBirth;
} Std;

Std* obj = calloc(1, sizeof(Std));
obj->name = malloc(50*sizeof char);
obj->surname = malloc(50*sizeof char);

scanf("%49s", obj->name);
scanf("%49s", obj->surname);

一些注意事项:

  • 在C中,不需要强制转换malloc的结果。相反,它在C ++中是必需的,因此可以省略它,除非您使用的是C ++编译器。
  • sizeof char是1。我将其添加到ypu分配的类型中。可以省略,否则可以使用sizeof(obj->name)`
  • [使用%49s,我确保将最多49个字符+字符串终止符写入我的char数组中,以避免不必要的越界访问
  • 作为替代,您可以更改Std定义以静态定义namesurname char数组的大小:

typedef struct Std{
    char name[50];
    char surname[50];
    int yearOfBirth;
} Std;

scanf("%49s", obj->name);
scanf("%49s", obj->surname);
© www.soinside.com 2019 - 2024. All rights reserved.