C: правильное использование strtok_r

Как я могу использовать strtok_r вместо strtok для этого?

char *pchE = strtok(NULL, " "); 

Теперь я пытаюсь использовать strtok_r правильно … Но иногда у меня возникают проблемы с strtol . У меня есть stream, который я выполняю 10 раз (в то же время).

 char *savedEndd1; char *nomeClass = strtok_r(lineClasses, " ", &savedEndd1); char *readLessonS = strtok_r (NULL, " ", &savedEndd1); char *readNTurma = strtok_r(NULL, " ", &savedEndd1); if (readNTurma==NULL) printf("CLASS STRTOL begin %s %s\n",nomeClass, readLessonS ); int numberNTurma = strtol(readNTurma, NULL, 10); 

И я readNTurma == NULL что readNTurma == NULL несколько раз … Почему? Не могу понять, почему он пришел NULL ?

Документация для strtok_r довольно ясна.

Функция strtok_r () является реентерабельной версией strtok (). Аргумент saveptr является указателем на переменную char *, которая внутренне используется strtok_r (), чтобы поддерживать контекст между последовательными вызовами, которые анализируют одну и ту же строку.

При первом вызове strtok_r () str должен указывать на строку, подлежащую анализу, и значение saveptr игнорируется. В последующих вызовах str должна быть NULL, а saveptr не должен меняться со времени предыдущего вызова.

Таким образом, у вас будет код вроде

 char str[] = "Hello world"; char *saveptr; char *foo, *bar; foo = strtok_r(str, " ", &saveptr); bar = strtok_r(NULL, " ", &saveptr); 

Протестированный пример:

 #include  #include  int main(void) { char str[] = "1,22,333,4444,55555"; char *rest = NULL; char *token; for (token = strtok_r(str, ",", &rest); token != NULL; token = strtok_r(NULL, ",", &rest)) { printf("token:%s\n", token); } return 0; } 

Результат.

 token:1 token:22 token:333 token:4444 token:55555 

Тест: http://codepad.org/6xRdIecI

Из документации linux, где акцент мой:

 char *strtok_r(char *str, const char *delim, char **saveptr); 

Функция strtok_r () является реентерабельной версией strtok (). Аргумент saveptr является указателем на переменную char *, которая внутренне используется strtok_r (), чтобы поддерживать контекст между последовательными вызовами, которые анализируют одну и ту же строку .

При первом вызове strtok_r () str должен указывать на строку, подлежащую анализу, и значение saveptr игнорируется. В последующих вызовах str должна быть NULL, а saveptr не должен меняться со времени предыдущего вызова .

Различные строки могут анализироваться одновременно с использованием последовательностей вызовов strtok_r (), которые указывают разные аргументы saveptr.

 char str[]="string for sample"; char *reserve; char *pchE = strtok_r(str, " ", &reserve);//when next call str -> NULL