与PHP并行';s";“爆炸”;在C中:使用分隔符将char*拆分为char*
可能重复:与PHP并行';s";“爆炸”;在C中:使用分隔符将char*拆分为char*,php,c,explode,strtok,Php,C,Explode,Strtok,可能重复: 我正在寻找一种使用分隔符将一个字符*转换为另一个字符*的好方法 我的分隔符将是#通常这就是函数的用途: char* tok; tok = strtok(srcStr, "#"); while(tok != NULL) { // Do stuff with tok tok = strtok(NULL, "#"); } 你可以像CrazyCasta说的那样使用strtok,但他/她的代码是错误的 char *tok; char *src = malloc(strle
我正在寻找一种使用分隔符将一个字符*转换为另一个字符*的好方法
我的分隔符将是
#
通常这就是函数的用途:
char* tok;
tok = strtok(srcStr, "#");
while(tok != NULL)
{
// Do stuff with tok
tok = strtok(NULL, "#");
}
你可以像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
,之后必须使用NULL
。另外,src
必须是可写的,因为strtok
写入\0
以终止找到的字符串。因此,根据您读取字符串的方式(以及以后是否使用它),您应该复制它。但正如我所说,这并不总是必要的
编辑:
explode
函数可能如下所示:
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);
你是在寻找这样的东西吗?现在没什么,只是在寻找一个好方法。这就是我的想法;通过char数组循环,并将每个char复制到另一个char*,直到当前char是我的分隔符。请参阅“explode”是一个函数名,是的,
strtok
是正确的调用,但您使用它的方式错误:(Durp,thx。我已经有一段时间没有实际使用它了。是的,我在使用它之前总是要看一看手册页,非常好,谢谢!显然我的编译器有点挑剔,所以我必须指定malloc和realloc的返回类型。char*tmp=(char*)malloc(strlen(src)+1)
和tmp=(char**)realloc(\u list,(sizeof*_list)*(*len+1));
和_list=(char**)realloc(NULL,sizeof*_list)……希望比特帮助某人。@ VinceK,你可能使用C++编译器,C编译器不需要你将一个<代码> Value>代码>转换为另一个指针。你是正确的。Pablo@VinceK请注意用C++编译器编译C代码。有一些不同,最终可能会产生奇怪的结果。
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)