5 votes

strtok() et champs vides

Je suis en train de sérialiser une structure C en chaîne de caractères et de la désérialiser avec strtok() . Mais, malheureusement, strtok() ne pas détecter les champs vides (par exemple 1:2::4).

Existe-t-il une fonction alternative ?

11voto

Drakosha Points 6360

Sous linux, il y a strsep .

La fonction strsep() a été introduite comme un remplacement de strtok(), puisque cette dernière ne peut pas gérer les vides. Cependant, strtok() est conforme à C89/C99 et est donc plus portable.

8voto

Tronic Points 6457

Vous pouvez utiliser strchr (pour un seul caractère de délimitation) ou strcspn (pour un groupe de délimiteurs possibles) pour trouver le délimiteur suivant, traiter le jeton, puis avancer d'un seul caractère. Faites-le dans une boucle et vous avez ce dont vous avez besoin.

0voto

Andreas M. Points 303

Drakosha a donné la bonne réponse. Je veux ajouter un exemple pour les deux variantes.

Avec strtok :

char *token;
char *tmp_string;
char delimiter[10] = " |,.:";
strcpy (tmp_string, "1:2::4");
token = strtok(tmp_string, delimiter); // first token
while(token != NULL) {
    i++;
    printf ("i=%d\tToken: len(%d)\t%s", i, strlen(token), token);
    // do something
    token = strtok(NULL, delimiter); /* next token */
}

Avec strsep (reconnaîtra "") :

char *token;
char *tmp_string;
char delimiter[10] = " |,.";
strcpy (tmp_string, "1:2::4");
token = strsep(&tmp_string, delimiter); // first token
while(token != NULL) {
    i++;
    printf ("i=%d\tToken: len(%d)\t%s", i, strlen(token), token);
    // do something
    token = strsep(&tmp_string, delimiter); /* next token */
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X