c - strsep() 函数 - 分隔符中包含更多字符

标签 c split strsep

我在使用 C 中的 strsep() 函数时遇到问题。我想将字符串分成两部分。该字符串包含有关当前播放歌曲的信息,采用 ARTIST - TITLE 格式,因此艺术家和标题之间用一个空格、一个破折号和一个空格分隔。我想用“-”来分隔它。 “-”不起作用,因为有些艺术家的名字中有破折号。

当我尝试使用此代码时,例如“Michel Telo - Ai Se Eu Te Pego”:

// String is in tmp
while ((token = strsep(&tmp, " - ")) != NULL)
{
    printf("%s\n", token);
}

我明白了:

[root@runeaudio ~]# ./board
Michel
Telo


Ai
Se
Eu
Te
Pego

而不是这个:

[root@runeaudio ~]# ./board
Michel Telo
Ai Se Eu Te Pego

似乎 strsep() 将分隔符分为 3 个字符:“”、“-”、“” 并在它们之间使用 OR,但我希望它按原样查找“-” 。知道如何解决这个问题吗?

最佳答案

下面的代码演示了如何分割字符串,它不是很有用,因为除了打印它们之外,它对标记没有任何作用,但您可以看到它是如何工作的并实现一个可以满足您需要的版本。

char string[] = "Michel Telo - Ai Se Eu Te Pego";
char *separator = strstr(string, " - ");
if (separator != NULL)
 {
     separator[0] = '\0';
     printf("%s\n", string);

     separator[0] = ' ';
     printf("%s\n", separator + 3);
 }

您当然可以使用 strdup() 或类似函数使用“ token ”的内容创建新字符串。

这当然不可靠,因为没有什么可以确保名字中不会有 "- " 的艺术家,但是如果它在歌曲名称中,那就还不错。

这是一个工作版本,如果您的平台上没有strdup(),那么肯定会有一个具有不同名称的实现

#include <string.h>

void extractArtistAndTitle(char *string, char **artist, char **title)
 {
    char *separator;

    if ((string == NULL) || (artist == NULL) || (title == NULL))
        return;
    separator = strstr(string, " - ");
    if (separator != NULL)
     {
        size_t length;

        length  = separator - string;
        *artist = malloc(1 + length);
        if (*artist != NULL)
        {
            memcpy(*artist, string, length);
           (*artist)[length] = '\0';
        }
        *title = strdup(separator + 3);
     }
 }

int main()
{
    char string[] = "Michel Telo - Ai Se Eu Te Pego";
    char *artist;
    char *title;

    extractArtistAndTitle(string, &artist, &title);
    if (artist != NULL)
        printf("Artist: %s\n", artist);
    if (title != NULL)
        printf("Title : %s\n", title);
    free(artist);
    free(title);

    return 0;
}

关于c - strsep() 函数 - 分隔符中包含更多字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30278332/

相关文章:

c - C中的strtok和strsep有什么区别

c - strtok_r 保存状态行为

c - 我如何才能正确退出程序?

javascript - 如何使用 javascript 将 <p><span>Hello</span></p> 拆分为 <span>Hello</span>

Java字符串到数组拆分

c - 使用 strsep 解析 C 中的字符串(替代方法)

c - for()函数在这里正确使用是什么

c++ - 堆栈动态和堆栈动态数组

c++ - Fortran 77 转换为 C++

c - 如何拆分分隔符大于一个字符的字符串?