scanf strings to structure char 指针
scanf strings to structure char pointer
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
将字符串保存到结构的字段中?
使用 calloc ()
,您为 obj
分配了 Std
结构所需的内存 space。但是通过此操作,您不会分配它包含的两个 char *
指针:name
和 surname
.
使用 scanf 访问它们意味着写入未定义的位置,这可能会导致分段错误。
所以,对他们来说 malloc ()
足以 space 包含名字和姓氏:
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
定义以静态定义 name
和 surname
字符数组的大小:
typedef struct Std{
char name[50];
char surname[50];
int yearOfBirth;
} Std;
scanf("%49s", obj->name);
scanf("%49s", obj->surname);
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
将字符串保存到结构的字段中?
使用 calloc ()
,您为 obj
分配了 Std
结构所需的内存 space。但是通过此操作,您不会分配它包含的两个 char *
指针:name
和 surname
.
使用 scanf 访问它们意味着写入未定义的位置,这可能会导致分段错误。
所以,对他们来说 malloc ()
足以 space 包含名字和姓氏:
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
定义以静态定义 name
和 surname
字符数组的大小:
typedef struct Std{
char name[50];
char surname[50];
int yearOfBirth;
} Std;
scanf("%49s", obj->name);
scanf("%49s", obj->surname);