OVH Cloud OVH Cloud

Problème avec strtok

3 réponses
Avatar
Nicolas Favre-Félix
Bonjour,

J'ai un petit problème avec la fonction strtok.
Dans le K&R, il est dit que dans une définition de fonction, char s[] et
char *s sont équivalents. Lorsque je fais ceci :

char chaine[] = "Chaine:a decouper";
char delimiteurs[] = ": ";
char* tk;

tk = strtok(chaine, delimiteurs);

while(tk !=NULL)
{
printf("%s\n", tk);
tk = strtok(NULL, delimiteurs);
}

Il n'y a pas de problème.

Par contre, lorsque chaine et delimiteurs sont définis par :

char *chaine = "Chaine:a decouper";
char *delimiteurs = ": ";

le programme compile mais plante à l'éxécution.
Pourtant, la définition de la fonction est char* strtok (char*, const
char*);

Comment faire pour utiliser des char* ?
J'ai trouvé sur google pas mal de codes utilisant cette fonction, mais ils
utilisent tous des char [].

Merci de votre aide.

Nicolas Favre-Félix.

3 réponses

Avatar
Al 1
Nicolas Favre-Félix a écrit:
Bonjour,

J'ai un petit problème avec la fonction strtok.
Dans le K&R, il est dit que dans une définition de fonction, char s[] et
char *s sont équivalents. Lorsque je fais ceci :


... dans une définition de fonction, pas de variable


char chaine[] = "Chaine:a decouper";


ici, tu crées un tableau de taille 18 et initialisé

char *chaine = "Chaine:a decouper";


ici chaine est un pointeur vers une chaine constante
(et devrait être un const char *, d'ailleurs - le compilateur devrait
indiquer un warning, mais bon j'en ai jamais vu)

le programme compile mais plante à l'éxécution.


strtok modifie son premier paramètre

dans le premier cas : chaine[] est modifiable
dans le deuxième cas : chaine pointe sur une zone de mémoire non
modifiable, ce qui provoque une erreur quand on essaie de modifier

Comment faire pour utiliser des char* ?


char *chaine = malloc (strlen ("Chaine:a decouper") + 1);
if (!chaine) ecran_bleu();
strcpy (chaine, "Chaine:a decouper");

si tu es sous unix:
char *chaine = strdup ("Chaine:a decouper");

ne pas oublier de libérer en sortant

Avatar
Cyrille \cns\ Szymanski
char chaine[] = "Chaine:a decouper";
char delimiteurs[] = ": ";
char* tk;

tk = strtok(chaine, delimiteurs);

while(tk !=NULL)
{
printf("%sn", tk);
tk = strtok(NULL, delimiteurs);
}

Il n'y a pas de problème.

Par contre, lorsque chaine et delimiteurs sont définis par :

char *chaine = "Chaine:a decouper";
char *delimiteurs = ": ";

le programme compile mais plante à l'éxécution.


Lorsque tu fais :
char chaine[] = "Chaine:a decouper";
ton programme alloue de la place et y copie "Chaine:a decouper".
L'appel a strtok() modifie la copie de cette chaîne et cela ne pose pas de
problème.

Lorsque tu fais :
char *chaine = "Chaine:a decouper";
ton programme fait pointer chaine vers un emplacement mémoire où il y a
"Chaine:a decouper". Le problème vient du fait que l'appel à strtok()
modifie la chaîne et que visiblement elle n'est pas stockée dans un endroit
où elle peut être modifiée.


Lorsque tu appelles une fonction qui modifie un argument, vérifie que c'est
possible.


--
_|_|_| CnS
_|_| for(n=0;b;n++)
_| b&=b-1; /*pp.47 K&R*/

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', "Nicolas Favre-Félix" wrote:

J'ai un petit problème avec la fonction strtok.
Dans le K&R, il est dit que dans une définition de fonction, char s[] et
char *s sont équivalents.


C'est faux.

Lire la FAQ.

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/