【问题标题】:Easiest way to split a string based on a few set words in C根据 C 中的几个单词来分割字符串的最简单方法
【发布时间】:2015-01-12 21:30:01
【问题描述】:

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

【问题讨论】:

  • 如果标题类似于How to Become an Artist: 101 Extremely Useful Tips,你会怎么做?
  • 你昨天不是问了基本相同的问题吗?
  • @iharob 我已经尝试使用strstr 和一堆函数来尝试解析每个项目。但是代码变成了意大利面条并且效果不佳:/
  • @Alex 试试chux 的解决方案。
  • @luserdroog 最初,我试图将文本从文件中取出并以这种方式分离。但是,我了解到scanf 不应该真正用于我的情况,所以我使用了fgets()。这个问题更多的是关于在程序内部拆分字符串,而不是从输入文件中解析它。

标签: c string token


【解决方案1】:

使用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:" 使用 ", Artist:".
" " 使用可选空白。
"%249[^,]" 扫描并保存最多 249 个非',' char进入.artist。追加 '\0'.
"," 使用 ",".
" " 使用可选的空白。 (这里不需要)
"%d" 扫描并保存int.year_published
" " 使用可选的空白。 (catch the \n)
"%n"保存buf的当前偏移量正在扫描。

n 只有在扫描结束时才会被设置。因此,非零值表示成功。它应该索引到字符串的末尾。


[编辑]

我现在看到similar post不要在此处讨论的fscanf() 方法中使用这种格式。

文件中的任何时候数据都是面向的,首先要考虑的是fgets()getline() 是否有它。这里的格式可能会被'\n' 愚弄或在意想不到的地方嵌入'\0'。所以最好 1) 读取该行并 2) 然后解析它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多