2015-05-16 2 views
2

У меня возникают проблемы с использованием функции strsep() в C. Я хочу разбить строку на две части. Строка содержит информацию о текущей воспроизводимой песне в формате ARTIST - TITLE, поэтому художник и заголовок разделены одним пространством, одним тире и снова одним пространством. Я хочу отделить это от этого, «-». «-» не будет работать, потому что у некоторых художников есть тире в их имени.Функция strsep() - больше символов в разделителе

Когда я пытаюсь этот код, например, "Мишель Telo - Ai Se Eu Te Pego":

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

Я получаю это:

[[email protected] ~]# ./board 
Michel 
Telo 


Ai 
Se 
Eu 
Te 
Pego 

Вместо этого:

[[email protected] ~]# ./board 
Michel Telo 
Ai Se Eu Te Pego 

Похоже, что strsep() разделяет разделитель на 3 символа: "", "-", "" и используя OR между ними, но я хочу искать «-», как есть. Любая идея, как это исправить?

+2

Аргумент разделителя для 'strsep', как и для' strtok', представляет собой список символов, которые считаются разделителями. –

+1

Используйте 'strstr()' вместо этого и найдите появление точного '' - ''. –

+1

[См. Здесь] (например, http://stackoverflow.com/questions/29847915/implementing-strtok-whose-delimiter-has-more-than-one-character/29848367#29848367). Я уверен, что на SO есть больше примеров реализации multi-char 'strtok'. –

ответ

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; 
} 
+0

И это имеет дополнительное преимущество - быть портативным - в Windows нет 'strsep' afaik. – szczurcio

+4

@szczurcio: 'strsep()' действительно не является стандартной функцией C. – chqrlie

+0

Спасибо, ваше решение работает! Я знаю, что это не очень надежный, но до сих пор я ничего не могу сделать. Я использую Raspberry Pi в качестве сетевого музыкального плеера, и я получаю текущую информацию о треке от MPD, которая возвращает информацию о песне, подобную этой, все в одной строке в формате ARTIST - TITLE, и я хочу разбить ее, чтобы показать ее на 2- линейный ЖК-дисплей, исполнитель в первой строке и название песни во второй строке. – XploD

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; 
} 
Смежные вопросы