我在使用 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/