Afficher un fichier
Fermé
charline159
Messages postés
208
Date d'inscription
lundi 14 août 2017
Statut
Membre
Dernière intervention
22 juin 2022
-
Modifié le 15 févr. 2021 à 19:18
charline159 Messages postés 208 Date d'inscription lundi 14 août 2017 Statut Membre Dernière intervention 22 juin 2022 - 2 mars 2021 à 15:22
charline159 Messages postés 208 Date d'inscription lundi 14 août 2017 Statut Membre Dernière intervention 22 juin 2022 - 2 mars 2021 à 15:22
A voir également:
- Afficher un fichier
- Fichier rar - Guide
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Ouvrir un fichier .bin - Guide
- Fichier host - Guide
3 réponses
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 096
Modifié le 16 févr. 2021 à 16:19
Modifié le 16 févr. 2021 à 16:19
Salut charline159,
En fait, tu veux travailler sur deux niveaux : tu délimites ta chaîne selon les virgules, pour chaque sous chaîne que tu trouves, tu veux la délimiter selon les (éventuels) guillemets.
Dans un tel cas, tu peux utiliser la version réentrante
http://manpagesfr.free.fr/man/man3/strtok.3.html
donne :
Sinon, ton cas étant assez simple, tu peux faire cela sur un seul niveau, en séparant par virgules seulement avec
Note que tout ceci fonctionne avec
Dal
En fait, tu veux travailler sur deux niveaux : tu délimites ta chaîne selon les virgules, pour chaque sous chaîne que tu trouves, tu veux la délimiter selon les (éventuels) guillemets.
Dans un tel cas, tu peux utiliser la version réentrante
strtok_r()(c'est du POSIX, mais c'est implémenté dans les versions récentes de MinGW) si tu as la possibilité de l'utiliser.
http://manpagesfr.free.fr/man/man3/strtok.3.html
#include <stdio.h> #include <string.h> int main(void) { char chaine[1024] = "2,\"Jumanji (1995)\",\"Adventure|Children|Fantasy\""; char * niveau1; char * p1; char * niveau2; char * p2; for (niveau1 = strtok_r(chaine, ",", &p1); niveau1 != NULL; niveau1 = strtok_r(NULL, ",", &p1)) { for (niveau2 = strtok_r(niveau1, "\",", &p2); niveau2 != NULL; niveau2 = strtok_r(NULL, "\",", &p2)) printf("%s\n", niveau2); } return 0; }
donne :
$ gcc -Wall 37094952.c
$ ./a.out
2
Jumanji (1995)
Adventure|Children|Fantasy
Sinon, ton cas étant assez simple, tu peux faire cela sur un seul niveau, en séparant par virgules seulement avec
strtok()et en regardant si le premier et le dernier caractère de la chaîne est un guillemet et si c'est le cas en incrémentant le pointeur de départ de la chaîne et en écrasant le guillemet de fin avec
'\0'....
Note que tout ceci fonctionne avec
strtok()ou
strtok_r()avec ton jeu de données car tu n'as pas de virgules à l'intérieur du texte entre guillemets. Si c'est un cas qui peut se produire, tu devrais opérer différemment.
Dal
wytekrow
Messages postés
8
Date d'inscription
lundi 30 novembre 2020
Statut
Membre
Dernière intervention
9 juillet 2021
2
15 févr. 2021 à 20:12
15 févr. 2021 à 20:12
strtok considère une suite de séparateurs comme un seul séparateur. Donc en gros, la séquence
Les séparateurs du second strtok contiennent un " de trop. Le troisième strtok n'a pas la virgule comme séparateur dans la liste du coup , est considéré comme un champ …
","est considérée comme un seul séparateur si tu donnes comme liste de séparateurs
,".
Les séparateurs du second strtok contiennent un " de trop. Le troisième strtok n'a pas la virgule comme séparateur dans la liste du coup , est considéré comme un champ …
charline159
Messages postés
208
Date d'inscription
lundi 14 août 2017
Statut
Membre
Dernière intervention
22 juin 2022
1
Modifié le 2 mars 2021 à 15:22
Modifié le 2 mars 2021 à 15:22
Salut Dal et merci pour ta réponse. Désolée de ne pas avoir répondu plus tôt (je tourne sur plusieurs projets et langages, selon le jour ou la semaine...)!
Merci pour ton aide, je vais essayer de tester strtok() de mon côté !
Merci pour ton aide, je vais essayer de tester strtok() de mon côté !