IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Découper une chaine de caractères


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Debuttant en developpement d'application
    Inscrit en
    Novembre 2014
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Guinée

    Informations professionnelles :
    Activité : Debuttant en developpement d'application

    Informations forums :
    Inscription : Novembre 2014
    Messages : 86
    Points : 55
    Points
    55
    Par défaut Découper une chaine de caractères
    Bonjours à tous,
    J'aimerais savoir comment découper une chaine de caractères. Par exemple je veux avoir avec cette chaine
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char chaine[]="Nom#Pernom#Age#";
    ça ch1[]="Nom",ch2[]="Prenom",ch3[]="Age".
    Merci d'avance.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 377
    Points : 23 663
    Points
    23 663
    Par défaut
    Bonsoir,

    Regarde du côté de strtok().

  3. #3
    Membre du Club
    Homme Profil pro
    Debuttant en developpement d'application
    Inscrit en
    Novembre 2014
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Guinée

    Informations professionnelles :
    Activité : Debuttant en developpement d'application

    Informations forums :
    Inscription : Novembre 2014
    Messages : 86
    Points : 55
    Points
    55
    Par défaut
    Ok merci, je vais y jeté un coup d'œil.

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 691
    Points : 30 988
    Points
    30 988
    Billets dans le blog
    1
    Par défaut
    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...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 631
    Points : 10 559
    Points
    10 559
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    comme par exemple découper "/xxx/yyy;/zzz/aaa;/bbb/ccc"
    Dans ton exemple on peut truquer

    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.

  6. #6
    Membre du Club
    Homme Profil pro
    Debuttant en developpement d'application
    Inscrit en
    Novembre 2014
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Guinée

    Informations professionnelles :
    Activité : Debuttant en developpement d'application

    Informations forums :
    Inscription : Novembre 2014
    Messages : 86
    Points : 55
    Points
    55
    Par défaut
    Bonjours, bon hier j’ai utilisé la fonction strtok() comme vous
    m’avez dit, voici ce que j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char *ligne = "Nom#Prenom#Age";
    char *delim = "#";
    char *token;
    token = strtok(ligne,delim);
    printf("%s",token);
    Mais le probleme est qu'il m'affiche seulement Nom.
    Je veux qu'il recupere tous.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 631
    Points : 10 559
    Points
    10 559
    Par défaut
    Pourtant la documentation est très claire (limpide) et comme l'a dit Sve@r, la fonction travaille avec une variable statique

    Non testé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char* ligne = "Nom#Prenom#Age";
    char *token;
    token = strtok(ligne, "#");
    while (token != NULL) { printf("%s\n", token); token = strtok(ligne, "#"); }

  8. #8
    Membre du Club
    Homme Profil pro
    Debuttant en developpement d'application
    Inscrit en
    Novembre 2014
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Guinée

    Informations professionnelles :
    Activité : Debuttant en developpement d'application

    Informations forums :
    Inscription : Novembre 2014
    Messages : 86
    Points : 55
    Points
    55
    Par défaut
    Merci beaucoup .

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 691
    Points : 30 988
    Points
    30 988
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par foetus Voir le message
    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
    Ah ? Tu veux dire "en faisant comme si on utilisait strtok_r()" ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 631
    Points : 10 559
    Points
    10 559
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ah ? Tu veux dire "en faisant comme si on utilisait strtok_r()" ???
    Je ne connais pas strtok_r , 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 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 "/"

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Bash - Découper une chaine de caractères
    Par nicolas.pissard dans le forum Shell et commandes GNU
    Réponses: 13
    Dernier message: 16/12/2014, 13h18
  2. Découper une chaine de caractères
    Par momomafioso dans le forum ASP.NET
    Réponses: 1
    Dernier message: 28/06/2007, 11h11
  3. [SQ2K] Découper une chaine de caractères
    Par maitrebn dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 17/04/2007, 19h22
  4. Réponses: 6
    Dernier message: 15/04/2007, 13h06
  5. [VBA] Découper une chaine de caractères
    Par rantanplan81 dans le forum VBA Access
    Réponses: 3
    Dernier message: 12/04/2007, 15h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo