strsep()函数 - 分隔符中的更多字符

时间:2015-05-16 16:50:43

标签: 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,但我希望它能找到" - "原样。知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

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

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()或类似功能创建包含“令牌”内容的新字符串。

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

这是一个有效的版本,如果您的平台上没有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;
}

答案 1 :(得分:0)

这是一个代码,使用该代码只能获取字符串,具体取决于' - '

#include <stdio.h>

int main()
{
    char token[100];
    int i,j=0,flag=0;
    char tmp[]="Michel Telo - Ai Se Eu Te Pego";
    for(i=0;tmp[i]!='\0';i++)
    {
        if((tmp[i]>='a' && tmp[i]<='z') || (tmp[i]>='A' && tmp[i]<='Z') || (tmp[i]==32 && !isalpha(tmp[i+1])))
        {
            flag=0;
            token[j++]=tmp[i];
            continue;
        }
        else if(flag==0 && tmp[i]=='-')
        {
            token[j]='\0';
            j=0;
            flag=1;
            printf("%s\n",token);
        }
    }
    token[j]='\0';
    printf("%s\n",token);
    return 0;
}