【问题标题】:Using strtok() to get specific fields使用 strtok() 获取特定字段
【发布时间】:2015-04-06 22:20:00
【问题描述】:

我目前正在读取一个 C 文件,其中包含格式为的歌曲列表

Track ID<SEP>Song ID<SEP>Artist Name<SEP>Song Title

我很难理解如何使用 strtok() 来获得 &lt;SEP&gt; 之后的歌曲艺术家和歌曲标题。

我们将不胜感激。

【问题讨论】:

  • 发布您目前拥有的代码及其问题所在,以及数据文件中的几行代码,可能有助于解决您的问题。
  • 必须比这更具体。有代码吗?示例行或要解析的字符串?到目前为止,您尝试过什么?
  • 曲目 ID歌曲 ID艺术家姓名歌曲名称。这是歌曲的格式。我刚刚注意到标签被删除了
  • '' 是单个字符吗?
  • 是的。我需要查看“”并仅获取艺术家姓名和歌曲名称。

标签: c pointers dynamic-programming


【解决方案1】:

如果我知道您正在从文件中读取每一行,然后对它们进行标记以检索歌曲、艺术家和标题,在 for 循环中调用 strtok 同时保持 field index 将满足您的需求:

#define MAXS 128
#define MAXL 1024
...
char song[MAXS] = {0};
char artist[MAXS] = {0};
char title[MAXS] = {0};
char buf[MAXL] = {0};
...

while ((fgets (buf, 254, file)) != NULL)
{
    char *p = buf;
    fldidx = 0;     /* field index */

    for (p = strtok (buf, <sep>); p != NULL; p = strtok (NULL, <sep>))
    {
        if (fldidx == 1) strncpy (song, p, strlen (p)+1);
        if (fldidx == 2) strncpy (artist, p, strlen (p)+1);
        if (fldidx == 3) strncpy (title, p, strlen (p)+1);

        fldidx++;
    }
}

根据需要调整MAXSMAXL。 (停止更改字段的 # 和顺序 :)

注意:&lt;sep&gt; 是一个通用占位符,必须替换为strtok有效分隔符字符串

【讨论】:

  • 您的帖子确认使用索引是可行的方法。我的原始代码中有索引,但我不确定是否有更有效的方法来处理 strtok 提取。
  • 没有任何更有效的方法。当您获得大量字段时,您可以继续使用if 或仅使用switch (fldidx) 并在您需要的case(s) 上操作。
  • strncpy 这种方式使用与memcpy 相同,不会复制最后的'\0'。除第一行外,其他所有内容的输出都可能不正确。 strtok 在这里也是假的:如果你修正语法,它将停在 '',这与预期的不太一样。
  • &lt;sep&gt; 是 OP 提供的某个分隔符的通用表示。 (除非他再次改变问题)strncpy 很好。
【解决方案2】:

将行放入缓冲区后...

char *TrackId = strtok( buffer, "<sep>" );
if( NULL != TrackId )
{
    char *SongID = strtok( NULL, "<sep>: );
    if( NULL != SongID )
    {
        char *ArtistName = strtok( NULL, "<sep>" );
        if( NULL != ArtistName )
        {
            char *SongTitle = strtok( NULL, "<sep>" );
            if( NULL != SongTitle )
            { // then have extracted all fields from line
                // process those fields
            }
         }
     }
  }

【讨论】:

  • 我已经在缓冲区中有这些行了。我不需要歌曲 id,trackid 只是艺术家姓名和歌曲名称
  • 把剩下的扔掉吧。
  • 您似乎混淆了strtokstrstrstrtok 不像你想的那样工作。无论如何,解析这个 XML 片段是一个非常糟糕的选择,strstr 会更合适。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多