在C语言中,有没有一种方法可以按多个字符来分割字符串?

12

在C语言中,是否有一种方法可以拆分一个包含多个字符分隔符的字符串(使用strtok或其他方法)?我正在寻找像这样的内容:

char a[14] = "Hello,World!";
char *b[2];
b[0] = strtok(a, ", ");
b[1] = strtok(NULL, ", ");

我希望这不要因为逗号和 W 之间没有空格而分割字符串。有没有办法实现这个目的?

3个回答

9

您可以反复调用substr函数,以查找边界字符串的出现并沿结果进行拆分。在找到一个结果后,将指针向前移动子字符串的长度并再次搜索。


2
如果你包含了<string.h>,那么它就是C语言;如果你使用std::substr并且包含了<cstring>,那么它就是C++语言。不过在C++中,你不会使用裸的字符指针来表示字符串。 - Kerrek SB
@Kerrek:这取决于你在做什么。裸的char指针对在解析内存映射文本文件时非常有效,而无需进行数据复制或分配。当然,你可以将它们包装成一个漂亮的类。 - Zan Lynx

4
你可以使用 char * strstr(const char *haystack, const char *needle) 来在字符串中定位分隔符。
char a[14] = "Hello,World!";
char b[2] = ", ";
char *start = a;
char *delim;
do {
    delim = strstr(start, b);
    // string between start and delim (or end of string if delim is NULL).
    start = delim + 2; // Use lengthof your b string.
} while (delim);

这不会给你任何第一个分隔符之前的内容(包括在“Hello,World!”的情况下什么也不会给你)。 - Rag
1
如果 strstr 返回 NULL,您将会增加 NULL;'char *b[2]=", "' 是错误的写法,正确的是 'char b[]=", ";' 或者 'const char *b=", ";'。 - user411313
@user411313:已修复char*b[],谢谢。但我看不出你第一点的问题在哪里。delim没有被增加,它仍然是NULL,并且将允许退出循环。问题在哪里? - Didier Trosset

1

可能是这样的吗?不能保证它能编译。 ;)

char* strstrtok(char *haystack, char *needle) {
    static char *remaining = null;
    char *working;

    if(haystack)
         working = haystack;
    else if(remaining)
         working = remaining;
    else
         return NULL;

    char *result = working;
    if(result = strstr(working, needle))
        remaining = working + strlen(needle) + 1;

    return result;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接