c - 根据 C 中的几个设置词拆分字符串的最简单方法

标签 c string token

我正在用 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/

相关文章:

c - 如何正确释放GDI资源?

c - 为什么 clang 无法展开循环(gcc 展开)?

string - 按 bash 中的行数对文本列进行排序

c - 将标记添加到数组 C

c++ - float 和 double 有什么区别?

c - C 中的段错误。适用于主要功能但不适用于我的功能

c - 字符*如何工作?

c - VxWorks串口读取字符串转换乱码

javascript - Parse.com 在云代码中创建 strip 卡 token (main.js)

python - 为非用户对象djangorest框架创建身份验证 token