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 :

Analyser une chaine de caractère et la formater


Sujet :

C

  1. #1
    Membre confirmé Avatar de saad.hessane
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 315
    Points : 496
    Points
    496
    Par défaut Analyser une chaine de caractère et la formater
    Bonjour tout le monde.
    Je me suis inventé un petit exercice aujourd'hui, mais dont je ne trouve pas la solution.
    Le problème générale consiste à prendre une chaine en entré et de me fournir une sortie formaté.
    L'entrée est en faite une ligne écrit par l'utilisateur, avec ce format :
    [NUM_ELEVE] [NOM__ELEVE] [PRENOM_ELEVE] [NOTE_ELEVE]
    Le problème c'est que il se peut qu'on trouve des élèves ayant des nom et des prénoms composées.
    Exemple :
    1 nom1 prenom1 17.5
    2 nom2 prenom2_1 prenom2_2 15
    3 nom3_1 nom3_2 prenom3 16
    Je veux que en sortie il y est ce schéma : "%d\t%s\t%f".
    Exemple
    1 [TAB] nom1 prenom1 [TAB] 17.5
    2 [TAB] nom2 prenom2_1 prenom2_2 [TAB] 15
    3 [TAB] nom3_1 nom3_2 prenom3 [TAB] 16
    Le programme doit donc lire le premier nombre et l'afficher, ajouter une tabulation, puis lire le nom et le prénom, les écrire séparés par espace, ajouté une tabulation, et enfin écrire la note.
    J'espère que vous avez compris un peu le but.
    Je bloque en faite dans l'analyse de la chaine.
    Supposons que la chaine entré soit : "12 William Henry Gates 3"
    Je commence par faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sscanf(in,"%d ", &num_eleve);
    printf("%d\t",convoc);
    Puis, ben je sais pas comment faire.
    Merci de m'aider.

  2. #2
    Membre actif Avatar de Belegkarnil
    Inscrit en
    Juin 2005
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juin 2005
    Messages : 289
    Points : 205
    Points
    205
    Par défaut
    Je crois bien que tu ne puisse pas, tu dois ajouter des élément à ta syntaxe. Par exemple mettre entre des guillemets nom et prénom, ou bien que le premier mot de nom et prénom commence par une majuscule, le reste en minuscule.

  3. #3
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Les nom et prénoms peuvent comporter des espaces donc tu ne peux pas utiliser espace comme délimiteur. Tu dois utiliser un caractère inutilisé, par exemple "12+William+Henry Gates+3". Ensuite tu peux utiliser strtok pour découper la chaîne selon le caractère '+' (pour avoir "12", "William", "Henry Gates", "3"). Utilise ensuite atoi pour convertir "12" et "3" en 12 et 3.

  4. #4
    Membre confirmé Avatar de saad.hessane
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 315
    Points : 496
    Points
    496
    Par défaut
    Ben moi qui me disais que c'était facile.
    J'avais pensée à une trace de programme comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    La chaine est "12 William Henry Gates 3";
    Je prend le 12, je l'affiche et je l'efface de la chaine.
    La chaine est donc "   William Henry Gates 3".
    Je fais un strrev.
    La chaine est "3 setaG yrneH mailliW   ".
    Je prend le premier nombre, je lui fait un strrev et je le met en mémoire. Je l'efface ensuite de la chaine. cela donnerai :"  setaG yrneH mailliW   ".
    Un dernier strrev donnerai : "   William Henry Gates  ".
    Reste plus qu'à enlever les espaces qui débordent et afficher le tout.
    Vous en dites quoi?

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 452
    Points : 37 048
    Points
    37 048
    Par défaut
    C'est un peu tordu et çà ne répond pas à la question du comment distinguer les champs nom, prenom lorsqu'ils sont "composés".
    Si tu te décides à mettre un séparateur entre les différents champs, l'analyse (ou ca commence et ou çà se termine) devient simple et pourra être réalisée avec strtok (par exemple).
    - W

  6. #6
    Membre confirmé Avatar de saad.hessane
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 315
    Points : 496
    Points
    496
    Par défaut
    Mais justement, l'entrée que je vais fournir n'est pas une saisie texte, mais un fichier in.txt.
    L'application devra fournir un fichier out.txt contenant les chaines formatées.
    Le fichier in.txt est déjà écris, donc si je m'amuse à ajouter des '+' pour séparateur, c'est pas gagné. Justement je veux que ce soit l'application qui me mettent des +, ou des tabulations.
    Vous vous voulez avoir un fichier in avec des + et transformer les + en TAB. C'est bête comme application .
    Eh bien non, le fichier a un format brûte avec des espaces comme séparateur entre tous les mots, et il faut se démerder.
    Se qu'on sais par contre c'est que la première colonne contient un identifiant, et que la dernière colonne est la note de l'étudiant. La colonne du milieu contient le nom suivi du prénom, ou le prénom suivi du nom, on s'en fou un peu.

  7. #7
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par ilys05
    Le fichier in.txt est déjà écrit, donc si je m'amuse à ajouter des '+' pour séparateur, c'est pas gagné
    Ben que veux-tu ? C'était une erreur de conception depuis de le départ. On ne peut pas utiliser un caractère utilisable dans les noms et prénoms comme séparateur, c'est pas évident ? Sinon, si comme tu dis les nom et prénoms peuvent être considérés comme un tout, alors tu peux utiliser l'algo que tu as pensé, mais on peut faire plus simple :

    La chaine est "12 William Henry Gates 3"
    On lit 12 (avec sscanf par exemple, n'utilise pas strtok si tu n'as pas sauvegardé la chaîne)
    On cherche le dernier espace dans la chaine (strrchr)
    On lit 3
    Connaissant la position des deux espaces les plus extrêmes (grâce à la lecture de 12 et de 13), on peut extraire la partie du milieu.

  8. #8
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Ou encore
    - on lit le numéro
    - on lit les mots suivants tant que ces mots ne commencent pas par un chiffre : ils forment la suite des nom+prénoms (je suppose qu'aucun nom ou prénom ne commence par un chiffre ce qui d'après mon expérience n'est pas très restrictif)
    - On lit la note

  9. #9
    Membre confirmé Avatar de saad.hessane
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 315
    Points : 496
    Points
    496
    Par défaut
    Citation Envoyé par Melem
    Ben que veux-tu ? C'était une erreur de conception depuis de le départ.
    Justement, c'est pour pallier à cette conception un peu louche que je veux transformer ces fichiers en des fichiers plus compréhensible par un ordinateur (et par excel surtout ).
    Mais comment fait tu pour extraire la chaine?

    Citation Envoyé par diogene
    Ou encore
    - on lit le numéro
    - on lit les mots suivants tant que ces mots ne commencent pas par un chiffre : ils forment la suite des nom+prénoms (je suppose qu'aucun nom ou prénom ne commence par un chiffre ce qui d'après mon expérience n'est pas très restrictif)
    - On lit la note
    Peux tu développer un peu plus. Merci à vous.

  10. #10
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par ilys05
    Mais comment fait tu pour extraire la chaine ?
    Si on a deux pointeurs, char * p1 (pointeur vers le premier espace) et char * p2 (pointeur vers le dernier espace), p2 - p1 donne le nombre de caractères qu'il y a entre ces deux espaces, premier espace inclus. On enlevant 1, on obtient le nombre de caractères formant les nom et prénoms. En faisant donc strncpy(nom_et_prenoms, p1 + 1, (p2 - p1) - 1), on obtient ce qu'on voulait (nom et prénoms).

  11. #11
    Membre confirmé Avatar de saad.hessane
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 315
    Points : 496
    Points
    496
    Par défaut
    Une dernière petite question, comment trouvé la position du dernier espace?
    [EDIT]
    C'est bon, merci Melem, j'avais pas vu strrchr.
    Merci à vous tous.

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

Discussions similaires

  1. Analyser une chaine de caractère
    Par dvp_zero dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 15/04/2010, 20h22
  2. [RegEx] Analyser une chaine de caractères
    Par moukit233 dans le forum Langage
    Réponses: 6
    Dernier message: 31/10/2009, 13h59
  3. Formater une chaine de caractère
    Par jean-pierreL dans le forum Langage
    Réponses: 3
    Dernier message: 26/12/2007, 15h59
  4. Analyser une chaine de caractère
    Par dahu17 dans le forum C#
    Réponses: 6
    Dernier message: 23/04/2007, 15h39
  5. Réponses: 3
    Dernier message: 01/02/2006, 19h26

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