我正在用 C 语言开发一个项目,我正在使用 fgets() 从文件中读取行。每个文件的格式是这样的:
Title: Name Here, Artist: Artist Here, Year Published: 2014
目前我将上面的行存储为单个字符串。问题是,我有一个名为 music_lib
的结构数组,其类型为 Song
,如下所示:
struct Song
{
char title[250];
char artist[250];
int year_published;
};
我希望能够拆分我拥有的字符串,并将 Name Here
存储在 title
中,将 Artist Here
存储在 artist
,以及 year_published
中的 2014
,同时丢弃我从文件中获得的其余字符串。
我看过 strtok()
但它似乎很难,因为我想忽略 Title:
和其他单词,以及逗号。有没有一种简单的方法可以让我猜找到一个子字符串 Title:
,存储它之后的任何内容直到逗号,然后找到子字符串 Artist:
存储那里的任何内容直到我打一个逗号.. 然后为 Year Published
做同样的事情?
最佳答案
使用 sscanf()
、"%[]"
(标题和艺术家)和 "%n"
定位结尾将解析缓冲区。
struct Song songa;
int n = 0;
int cnt = sscanf(buf,
" Title: %249[^,], Artist: %249[^,], Year Published: %d %n",
songa.title, songa.artist, &songa.year_published, &n);
if (cnt == EOF) Handle_EOF();
if (n > 0 && buf[n] == '\0') Success();
else Handle_BadBuffer();
格式分解 "标题:%249[^,],艺术家:%249[^,],出版年份:%d %n"
""
使用可选的前导空白。
“Title:”
消费“Title:”。
""
使用可选的空格。
"%249[^,]"
最多扫描249个非','
char
到.title
。附加 '\0'
.
", 艺术家:"
消费", 艺术家:".
""
使用可选的空格。
"%249[^,]"
扫描并保存最多249个非','
char
到.artist
。附加 '\0'
.
","
消费",".
""
使用可选的空白。 (这里真的不需要)
"%d"
扫描并保存一个int
到.year_published
。
""
使用可选的空白。 (捕获\n)
"%n"
保存 buf
扫描的当前偏移量。
n
仅在扫描结束时设置。所以非零值表示成功。并且它应该索引到字符串的末尾。
[编辑]
我现在看到一个 similar post .最好不将此格式与此处讨论的fscanf()
方法一起使用。
任何时候文件中的数据都是面向行的,首先要考虑的是fgets()
或getline()
是否可用。此处的格式可能会被 '\n'
欺骗或在意想不到的地方嵌入 '\0'
。所以最好 1) 阅读该行,然后 2) 解析它。
关于c - 根据 C 中的几个设置词拆分字符串的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27911061/