strsep() 函数 - 分隔符中的更多字符
strsep() function - more characters in delimiter
我在使用 C 中的 strsep()
函数时遇到问题。我想将一个字符串分成两部分。该字符串包含有关当前播放歌曲的信息,采用 ARTIST - TITLE
格式,因此艺术家和标题由一个 space、一个破折号和一个 space 分隔。我想用这个分隔它,“-”。 “-”不起作用,因为有些艺术家的名字中有破折号。
当我尝试使用此代码时,例如 "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] = '[=10=]';
printf("%s\n", string);
separator[0] = ' ';
printf("%s\n", separator + 3);
}
您当然可以使用 strdup()
或类似函数来创建包含“tokens”内容的新字符串。
这当然是不可靠的,因为没有什么能保证不会有一个艺术家的名字带有" - "
,但是如果是在歌名中,那还不错。
这是一个工作版本,如果您的平台上没有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] = '[=11=]';
}
*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;
}
这是一个代码,使用它您只能根据“-”获取字符串
#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]!='[=10=]';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]='[=10=]';
j=0;
flag=1;
printf("%s\n",token);
}
}
token[j]='[=10=]';
printf("%s\n",token);
return 0;
}
我在使用 C 中的 strsep()
函数时遇到问题。我想将一个字符串分成两部分。该字符串包含有关当前播放歌曲的信息,采用 ARTIST - TITLE
格式,因此艺术家和标题由一个 space、一个破折号和一个 space 分隔。我想用这个分隔它,“-”。 “-”不起作用,因为有些艺术家的名字中有破折号。
当我尝试使用此代码时,例如 "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] = '[=10=]';
printf("%s\n", string);
separator[0] = ' ';
printf("%s\n", separator + 3);
}
您当然可以使用 strdup()
或类似函数来创建包含“tokens”内容的新字符串。
这当然是不可靠的,因为没有什么能保证不会有一个艺术家的名字带有" - "
,但是如果是在歌名中,那还不错。
这是一个工作版本,如果您的平台上没有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] = '[=11=]';
}
*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;
}
这是一个代码,使用它您只能根据“-”获取字符串
#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]!='[=10=]';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]='[=10=]';
j=0;
flag=1;
printf("%s\n",token);
}
}
token[j]='[=10=]';
printf("%s\n",token);
return 0;
}