c - 如何将格式化的字符串传递给C中的结构?
问题描述
在将字符串拆分为 struct 的元素时引用了类似的问题。
在我的项目的一部分中,我一直在进入signal: segmentation fault (core dumped)
. 我的任务是从文件(文件的一行)中提取格式化字符串,并将其转换为结构。例如,我已经提取了一个字符串“t,a,1990”,我想用它sscanf
来生成一个结构体s
,其中s.title
是“ t
”等等。我注意到在给定的结构中,标题和艺术家都是指针。我是该语言的新手,我想知道为什么在这里将指针 ( s.title
and s.artist
) 传递给指针是无效的。
如何在不更改 struct def 的情况下解决它?
这是我的代码:
#include <stdio.h>
typedef struct {
char* title;
char* artist;
int year;
} song;
int main(void) {
song s;
// read from string
char str[]= "t,a,1990";
char* strptr = str;
sscanf(strptr, "%s,%s,%d", s.title, s.artist, &(s.year));
printf("title = %s, artist = %s, year= %d\n", s.title, s.artist, s.year);
return 0;
}
谢谢!
解决方案
每个变量代表一个特定的内存量。如果您尝试使用比分配(保留)更多的内存,则会发生分段错误。
在这种情况下,您“将字符串读取到内存”,而没有分配任何内存来实际保存该内存。您提供的指针实际上并不指向任何东西。
因此,要么:
- 动态分配足够的内存(别忘了清理)
- 在编译期间保留足够的内存。
对于后一种情况,您的结构将如下所示:
typedef struct {
char title[20];
char artist[20];
int year;
} song;
此结构为您的字符串保留 20 个字符。只要你的弦比那个短,你就没事。如果它变得更长,您将遇到与以前相同的问题。
此外,里面的大括号&(s.year)
是不必要的。(&s.year
完全没问题)。
如果您想“不更改结构定义”,则需要使用动态内存分配。
用于此目的的 C 中的关键函数是malloc
and free
(需要stdlib.h
)。因此,您的代码将变为:
char str[]= "t,a,y";
char* strptr = str;
s.title = malloc(20);
s.artist = malloc(20);
sscanf(strptr, "%s,%s,%d", s.title, s.artist, &s.year);
printf("title = %s, artist = %s, year= %d\n", s.title, s.artist, s.year);
free(s.title);
free(s.artist);
未能调用“免费”会导致内存泄漏。
推荐阅读
- react-native - React Native & Amplify - 构建命令
- mysql - 如何在mysql中获取上周五过去7天的数据?
- javascript - 如何在不按下键盘的情况下让 JavaScript 按下键盘上的键?js
- python - 可以为数据帧的不同列分离使用 SimpleImputer 吗?
- reactjs - 运行“npm run build”时,我收到一条错误消息“无法识别‘CI’”
- sql-server - T-SQL GRANT 作为列值
- firebase - 如何通过读取环境对象来纠正此问题?(SwiftUI 并且在没有 SceneDelegate 的情况下工作)
- matlab - 我应该如何并行化我的遗传算法适应度评估?
- r - R函数查找排序向量中值的等级
- javascript - 我该如何解决:无法获取/上传错误