Bonjours à tous,
J'aimerais savoir comment découper une chaine de caractères. Par exemple je veux avoir avec cette chaine
ça ch1[]="Nom",ch2[]="Prenom",ch3[]="Age".Code:char chaine[]="Nom#Pernom#Age#";
Merci d'avance.
Version imprimable
Bonjours à tous,
J'aimerais savoir comment découper une chaine de caractères. Par exemple je veux avoir avec cette chaine
ça ch1[]="Nom",ch2[]="Prenom",ch3[]="Age".Code:char chaine[]="Nom#Pernom#Age#";
Merci d'avance.
Bonsoir,
Regarde du côté de strtok().
Ok merci, je vais y jeté un coup d'œil.
Bonjour
strtok() conviendra pour un petit test d'essai mais cette fonction possède le grave inconvénient de mémoriser son pointeur de travail en static et ne conviendra pas pour des algos imbriqués comme par exemple découper "/xxx/yyy;/zzz/aaa;/bbb/ccc" qui impliquera une première boucle de strtok() sur ";" et une seconde boucle interne de strtok() sur "/". Lorsque la seconde boucle interne se termine, la première ne fonctionne plus car strtok() a perdu le fil des différents ";"
Si on veut un code plus robuste, il vaut mieux lui préférer strtok_r() ("r" pour "réentrant"). Certes c'est au programmeur de lui passer un pointeur de travail mais justement il peut en gérer plusieurs selon les différents token qu'il doit traiter...
Dans ton exemple on peut truquer :mrgreen: :mrgreen:
On fait un strtok() sur '/' et on sait que tous les 2 à partir du 2ième '/', il doit y avoir un ';' juste avant le '/'.
Et même avec l'exemple "/xxx/yyy;zzz/aaa;bbb/ccc" on peut procéder de la même façon avec un strtok() sur ';' et en mémorisant la position (et éventuellement remplacer le ';' par un '\0'). Mais en C, il n'y a pas de tableau dynamique natif comme std::vector ce qui faciliterait la tâche.
Bonjours, bon hier j’ai utilisé la fonction strtok() comme vous
m’avez dit, voici ce que j'ai fait
Mais le probleme est qu'il m'affiche seulement Nom.Code:
1
2
3
4
5 char *ligne = "Nom#Prenom#Age"; char *delim = "#"; char *token; token = strtok(ligne,delim); printf("%s",token);
Je veux qu'il recupere tous.
Pourtant la documentation est très claire (limpide) et comme l'a dit Sve@r, la fonction travaille avec une variable statique
Non testé :wow:
Code:
1
2
3
4 char* ligne = "Nom#Prenom#Age"; char *token; token = strtok(ligne, "#"); while (token != NULL) { printf("%s\n", token); token = strtok(ligne, "#"); }
Merci beaucoup ;).
Je ne connais pas strtok_r :mrgreen:, mais cela à l'air d'être cela.
Le truc que je ferais c'est de transformer "/xxx/yyy;zzz/aaa;bbb/ccc" comme ceci "/xxx/yyy\0zzz/aaa\0bbb/ccc" avec [0, 10, 18, strlen + 1]
Et après :mrgreen: tu refais (N - 1) strtok, entre les index tab[A] et tab[A + 1] - 1, inclus
PS: je me suis planté dans mon précédent message, c'est en recherchant les ";" et non pas "/" :wow: