c - 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
将字符串保存到结构的字段中?
解决方案
calloc ()
为您分配结构obj
所需的内存空间。Std
但是通过此操作,您不会分配char *
它包含的两个指针:name
和surname
.
使用 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);
推荐阅读
- android - 创建具有相同名称的不同属性
- html - 在 p 标签中添加 ul 时,Angular 模板解析错误
- azure - 使用哪个 Azure 监控服务来可视化组件之间的关系?
- android - 根据过滤器将数组一分为二
- javascript - 如何在 Node.js 中声明和使用地图/字典?
- amazon-web-services - AWS Pinpoint:如何查看自定义指标
- dynamics-crm - Dynamics 365 本地 - Wep Api - 错误响应
- r - 将多项选择数据转换为数字
- c# - 这是我的连接字符串请告诉我有什么问题
- sql - 查询以获取给定表列的依赖视图定义和详细信息