Параллельно с «взрывом» PHP в C: разделите char * на char *, используя разделитель

Возможный дубликат:
Разделить строку с разделителями на C

Я ищу хороший способ «взорвать» символ * в другой символ *, используя разделитель.

Мой разделитель будет #

    Вы можете использовать strtok как сказал CrazyCasta, но его / ее код ошибочен.

     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 что 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); 

    это пример работы с 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, "#"); }