基于C语言中的几个单词分割字符串的最简单方法

时间:2015-01-12 21:30:01

标签: 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中,将2014存储在year_published中同时丢弃我从文件中获取的其余字符串。

我看过strtok(),但似乎很难,因为我想忽略Title:等词和逗号。有没有一种简单的方法可以找到一个子串Title:,存储之后的任何内容直到逗号,然后找到子串Artist:存储任何内容,直到我点击逗号...然后执行对Year Published来说是一样的吗?

1 个答案:

答案 0 :(得分:3)

使用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();

格式细分" Title: %249[^,], Artist: %249[^,], Year Published: %d %n"

" "使用可选的前导空格。
"Title:"消耗“标题:” " "使用可选的空格。
"%249[^,]"扫描并保存最多249个非',' char.title。附加'\0'
", Artist:"消费“,艺术家:” " "使用可选的空格。
"%249[^,]"扫描并保存最多249个非',' char.artist。附加'\0'
","消耗“,” " "使用可选的空格。 (这里不是真的需要)
"%d"扫描并将int保存到.year_published " "使用可选的空格。 (抓住\ n)
"%n"保存buf扫描的当前偏移量。

只有在扫描结束时才会设置

n。因此,非零值表示成功。并且它应该索引到字符串的末尾。


[编辑]

我现在看到similar post。使用此处讨论的fscanf()方法使用此格式是件好事。

文件中的任何时候数据都面向,首先考虑的是fgets()getline()。此处的格式可能会在意外的地方被'\n'或嵌入式'\0'所欺骗。所以最好1)读取行,2)然后解析它。