2

C で関数を使用すると問題が発生しstrsep()ます。文字列を 2 つの部分に分割したいと考えています。文字列には、現在再生中の曲に関する情報がARTIST - TITLE形式で含まれているため、アーティストとタイトルはスペース 1 つ、ダッシュ 1 つ、スペース 1 つで区切られます。この「-」で区切りたいと思います。一部のアーティストは名前にダッシュが含まれているため、「-」は機能しません。

たとえば、「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を使っているようですが、そのまま「 - 」を探してほしいです。これを修正する方法はありますか?

4

2 に答える 2

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);
 }

もちろん、または同様の関数を使用して、「 tokensstrdup() 」の内容で新しい文字列を作成できます。

もちろん、これは堅牢ではありません。名前にアーティストが含まれていないことを保証できるものは何も" - "ないためです。ただし、曲名にアーティストが含まれている場合は、それほど悪くはありません.

これは動作するバージョンです。プラットフォームにない場合は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;
}
于 2015-05-16T16:54:41.903 に答える
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;
}
于 2015-05-16T17:03:46.353 に答える