C: utilisation correcte de strtok r

Comment puis-je utiliser strtok_r au lieu de strtok pour le faire?

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

Maintenant, j'essaie d'utiliser strtok_r correctement... Mais parfois j'ai des problèmes avec le strtol. J'ai un fil que j'exécute 10 fois (en même temps).

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 %sn",nomeClass, readLessonS );
int numberNTurma = strtol(readNTurma, NULL, 10);

Et je l'attrape plusieurs fois... Pourquoi est-ce? Ne peux pas comprendre pourquoi il vient NULL?

32
demandé sur Toby Allen 2013-04-12 04:41:33

3 réponses

La documentation pour strtok_r est assez claire.

La fonction strtok_r () est une version réentrante de strtok (). L'argument saveptr est un pointeur vers une variable char * qui est utilisée en interne par strtok_r() afin de maintenir le contexte entre les appels successifs qui analysent la même chaîne.

Lors du premier appel à strtok_r (), str doit pointer vers la chaîne à analyser, et la valeur de saveptr est ignorée. Dans les appels suivants, str doit être NULL et saveptr devrait être inchangé depuis l'appel précédent.

Donc vous auriez un code comme

char str[] = "Hello world";
char *saveptr;
char *foo, *bar;

foo = strtok_r(str, " ", &saveptr);
bar = strtok_r(NULL, " ", &saveptr);
34
répondu tangrs 2014-07-09 09:23:31

Exemple testé:

#include <stdio.h>
#include <string.h>

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;
}

Résultat.

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

Test: http://codepad.org/6xRdIecI

De documentation linux où l'accent est le mien:

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

La fonction strtok_r () est une version réentrante de strtok (). l'argument saveptr est un pointeur vers une variable char * qui est utilisée en interne par strtok_r() afin de maintenir le contexte entre les appels successifs qui analysent la même chaîne.

Au premier appel pour strtok_r(), str doit pointer vers la chaîne à analyser, et la valeur de saveptr est ignorée. Dans les appels suivants, str doit être NULL, et saveptr doit être inchangé depuis l'appel précédent .

Différentes chaînes peuvent être analysées simultanément en utilisant des séquences d'appels à strtok_r() qui spécifient différents arguments saveptr.

10
répondu MrHIDEn 2018-09-13 14:16:19
char str[]="string for sample";
char *reserve;
char *pchE = strtok_r(str, " ", &reserve);//when next call str -> NULL
1
répondu BLUEPIXY 2013-04-12 00:46:23