问题 有没有办法在C中的多个字符上拆分字符串?


C中有没有办法拆分字符串(使用 strtok 或者任何其他方式)分隔符的长度是多个字符?我正在寻找这样的东西:

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

我希望这不会拆分字符串,因为逗号和W之间没有空格。有没有办法做到这一点?


4577
2017-08-16 14:21


起源



答案:


你可以反复打电话 substr 查找边界字符串的出现位置并沿结果分割。找到结果后,将指针前进到子字符串的长度并再次搜索。


8
2017-08-16 14:23



那是C还是C ++? - Jason
如果包括,那就是C. <string.h>如果你说,那就是C ++ std::substr 并包括 <cstring>虽然在C ++中你不会使用裸字符串指针。 - Kerrek SB
@Kerrek:取决于你在做什么。裸字符指针对非常适合解析内存映射文本文件而无需数据副本或分配。当然,你把它们包装在一个很好的课堂上。 - Zan Lynx
+1这是必要的,这很烦人,但谢谢! - Daniel


答案:


你可以反复打电话 substr 查找边界字符串的出现位置并沿结果分割。找到结果后,将指针前进到子字符串的长度并再次搜索。


8
2017-08-16 14:23



那是C还是C ++? - Jason
如果包括,那就是C. <string.h>如果你说,那就是C ++ std::substr 并包括 <cstring>虽然在C ++中你不会使用裸字符串指针。 - Kerrek SB
@Kerrek:取决于你在做什么。裸字符指针对非常适合解析内存映射文本文件而无需数据副本或分配。当然,你把它们包装在一个很好的课堂上。 - Zan Lynx
+1这是必要的,这很烦人,但谢谢! - Daniel


您可以使用 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);

4
2017-08-16 14:27



在第一个分隔符之前,这不会给你任何东西(包括在“你好,世界!”的情况下根本不给你任何东西) - Brian Gordon
谢谢Brian。固定。 - Didier Trosset
-1如果strstr返回NULL,您将增加NULL; 'char * b [2] =“,”'是一个错误,正确的是'char b [] =“,”;'或'const char * b =“,”;' - user411313
@ user411313:已修复 char*b[], 谢谢。但我看不出你的第一点问题。 delim 没有增加,它保持为 NULL,并允许退出循环。问题出在哪里? - Didier Trosset


这样的事可能吗?不保证这会编译。 ;)

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

1
2017-08-16 14:39



它只是C99代码 - user411313