2011-08-16 86 views
11

在分隔符长度超过一个字符的情况下,C中是否有方法来拆分字符串(使用strtok或任何其他方式)?我在寻找这样的事情:有没有办法在C中分割多个字符的字符串?

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

我想这是因为逗号之间没有空格和W.有没有办法做到这不拆分字符串?

回答

8

您只需重复呼叫substr即可查找边界字符串的出现情况并沿结果分割。找到结果后,按子串的长度前进指针并再次搜索。

+0

是C还是C++? – Jason

+2

如果你包含'',它就是C,如果你说'std :: substr'并且包含'',它就是C++,尽管在C++中你不会使用字符串的裸指针。 –

+0

@Kerrek:取决于你在做什么。裸字符指针对非常适合解析内存映射文本文件,而不需要数据副本或分配。当然,你把它们包装在一个不错的课堂中。 –

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); 
+0

虽然在第一个分隔符之前不会给你任何东西(包括在“Hello,World!”的情况下根本不会给你任何东西) –

+0

Thanks Brian。Fixed。 –

+1

-1如果strstr返回NULL,你将增加NULL;'char * b [2] =“,”'是错误,正确的是'char b [] =“,”;'或'const char * b =“,”;' – user411313

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

它只有C99代码 – user411313

相关问题