Не обязательно делать копию - strtok()
действительно изменяет строку, которую он токенизирует, но в большинстве случаев это просто означает, что строка уже токенизирована, если вы хотите снова иметь дело с токенами.
Вот ваша программа, немного измененная для обработки токенов после вашего первого прохода:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int i;
char buffer[] = "some, string with , tokens";
char* tok;
int count = 0;
tok = strtok(buffer, ",");
while(tok != NULL) {
count++;
tok = strtok(NULL, ",");
}
// walk through the tokenized buffer again
tok = buffer;
for (i = 0; i < count; ++i) {
printf( "token %d: \"%s\"\n", i+1, tok);
tok += strlen(tok) + 1; // get the next token by skipping past the '\0'
tok += strspn(tok, ","); // then skipping any starting delimiters
}
return 0;
}
Обратите внимание, что это, к сожалению, хитрее, чем я впервые опубликовал - вызов strspn()
необходимо выполнить после пропуска '\ 0 'помещается на strtok()
, так как strtok()
пропустит любые начальные символы разделителя для возвращаемого токена (без замены символа разделителя в источнике).