与PHP在C中的“爆炸”并行:使用分隔符将char *拆分为char *

可能重复:
在C中拆分带分隔符的字符串

我正在寻找一种使用分隔符将char * “爆炸”成其他char *的好方法。

我的分隔符将是#

你可以使用像CrazyCasta这样的strtok但他/她的代码是错误的。

 char *tok; char *src = malloc(strlen(srcStr) + 1); memcpy(src, srcStr); tok = strtok(src, "#"); if(tok == NULL) { printf("no tokens found"); free(src); return ???; } printf("%s ; ", tok); while((tok = strtok(NULL, "#"))) printf("%s ; ", tok); printf("\n"); free(str); 

请注意,必须首次使用源指针调用strtok ,之后必须使用NULLsrc必须是可写的,因为strtok\0来终止找到的字符串。 因此,根据您阅读字符串的方式(以及之后是否要使用它),您应该复制它。 但正如我所说,这并不总是必要的。

编辑:

explodefunction可能如下所示:

 char *strdup(const char *src) { char *tmp = malloc(strlen(src) + 1); if(tmp) strcpy(tmp, src); return tmp; } void explode(const char *src, const char *tokens, char ***list, size_t *len) { if(src == NULL || list == NULL || len == NULL) return; char *str, *copy, **_list = NULL, **tmp; *list = NULL; *len = 0; copy = strdup(src); if(copy == NULL) return; str = strtok(copy, tokens); if(str == NULL) goto free_and_exit; _list = realloc(NULL, sizeof *_list); if(_list == NULL) goto free_and_exit; _list[*len] = strdup(str); if(_list[*len] == NULL) goto free_and_exit; (*len)++; while((str = strtok(NULL, tokens))) { tmp = realloc(_list, (sizeof *_list) * (*len + 1)); if(tmp == NULL) goto free_and_exit; _list = tmp; _list[*len] = strdup(str); if(_list[*len] == NULL) goto free_and_exit; (*len)++; } free_and_exit: *list = _list; free(copy); } 

然后你必须称它为:

 char **list; size_t i, len; explode("this;is;a;string", ";", &list, &len); for(i = 0; i < len; ++i) printf("%d: %s\n", i+1, list[i]); /* free list */ for(i = 0; i < len; ++i) free(list[i]); free(list); 

这是用valgrind运行的示例:

 valgrind ./a ==18675== Memcheck, a memory error detector ==18675== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al. ==18675== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info ==18675== Command: ./a ==18675== 1: this 2: is 3: a 4: string ==18675== ==18675== HEAP SUMMARY: ==18675== in use at exit: 0 bytes in 0 blocks ==18675== total heap usage: 9 allocs, 9 frees, 114 bytes allocated ==18675== ==18675== All heap blocks were freed -- no leaks are possible ==18675== ==18675== For counts of detected and suppressed errors, rerun with: -v ==18675== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 4) 

通常这是strtok函数的用途:

 char* tok; tok = strtok(srcStr, "#"); while(tok != NULL) { // Do stuff with tok tok = strtok(NULL, "#"); }