Я думаю, вы пытаетесь смешать strtok()
и strtok_r()
.Синтаксис strtok()
выглядит следующим образом:
char * strtok ( char * str, const char * delimiters );
, а синтаксис strtok_r()
выглядит следующим образом:
char * strtok_r ( char * str, const char * delimiters, char **saveptr );
Когда мы вызываем strtok()
в первый раз,функция ожидает строку C в качестве аргумента для str, чей первый символ используется в качестве начального местоположения для сканирования токенов.При последующих вызовах функция ожидает нулевой указатель и использует позицию сразу после конца последнего токена в качестве нового начального местоположения для сканирования.Точка, в которой был найден последний токен, внутренне сохраняется функцией, которая будет использоваться при следующем вызове.
Однако в strtok_r()
третий аргумент saveptr
является указателем на переменную char *
это используется внутренне strtok_r()
для поддержания контекста между последовательными вызовами, которые анализируют одну и ту же строку.
Пример для strtok_r()
выглядит следующим образом:
char str[] = "sample strtok_r example gcc stack overflow";
char * token;
char * raw_in = str;
char * saveptr;
//delimiter is blank space in this example
token = strtok_r(raw_in, " ", &saveptr);
while (token != NULL) {
printf("%s\n", token);
printf("%s\n", saveptr);
token = strtok_r(NULL, " ", &saveptr);
}
Выходные данныедолжно быть следующим:
sample
strtok_r example gcc stack overflow
strtok_r
example gcc stack overflow
example
gcc stack overflow
gcc
stack overflow
stack
overflow
overflow
Источник:
http://www.cplusplus.com/reference/cstring/strtok/
https://www.geeksforgeeks.org/strtok-strtok_r-functions-c-examples/
Вопросы приветствуются.