首页 > 解决方案 > scanf 字符串来构造 char 指针

问题描述

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将字符串保存到结构的字段中?

标签: cscanf

解决方案


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我确保在我的 char 数组中最多写入 49 个字符 + 字符串终止符,避免不必要的越界访问

作为替代方案,您可以更改Std定义以静态定义char 数组name的大小:surname

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

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

推荐阅读