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 :

parsing de chaine - connaître le type du résultat


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 2
    Points : 1
    Points
    1
    Par défaut parsing de chaine - connaître le type du résultat
    Boujours, je recherche un truc tout bete que je n'arrive pas à retrouver :

    j'ai un fichier de ce style :

    azerty 123 456 789 123 456
    qwerty 123 456 789 123 456

    et j'aimerais creer plusieurs chaines contenant les valeurs en chiffre uniquement.

    donc j'ai tout stocké dans un buffer, puis je teste la chaine pour voir ou sont les espaces, mais je ne sais plus comment tester pour savoir si le caractére est un chiffre sans multiplier les IF.

    Merci d'avance de votre aide

  2. #2
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    #include <ctype.h>

    int isdigit(int c);

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Si j'ai bien tout compris dans ce que tu voulais faire !

    Soit une chaine 's_str' contenant une ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "azerty 123 456 789 123 456"
    Tu peux récupérer les données une par une:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    char * p_tok = NULL;
     
    /*
     * Ici on recupere le nom ("azrty")
     */
    p_tok = strtok (s_str, " ");
     
    if (p_tok != NULL)
    {
       /*
        * On recupere ici les donnees numeriques une par une
        */
       while (p_tok (NULL, " ") != NULL)
       {
          /*
           * ... Traitement ... par exemple avec isdigit comme cite avant ou mieux, avec strtol.
           */
       }
    }
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par Franck.H
    /*
    * ... Traitement ... par exemple avec isdigit comme cite avant.
    */
    }
    Dans ce cas, autant utiliser strtol() directement.

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par DaZumba
    Dans ce cas, autant utiliser strtol() directement.
    Oui biensur
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Attention quand même, le strtok plante avec ce genre de chaîne. : char * s_str = "azerty 123 456 789 123 456"; puisque strtok modifie la chaîne initiale et cette chaîne initiale ben elle est dans une zone non modifiable.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par Trap D
    Attention quand même, le strtok plante avec ce genre de chaîne. : char * s_str = "azerty 123 456 789 123 456"; puisque strtok modifie la chaîne initiale et cette chaîne initiale ben elle est dans une zone non modifiable.
    Oui c'est vrai, mais c'etait du vite fait à titre d'exemple étant donné que dans son cas il utilise un buffer donc une zone allouée ou un tableau static

    UP !

    Voilà, je l'ai présenté autrement pour éviter toute confusion mais sans entrer dans des détails
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  8. #8
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Bonjour,

    Si la chaine est formatée, pourquoi ne pas simplement utiliser sscanf ???

    Un très bon cours dessus ici.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ret_value = sscanf ("%s %d %d %d %d %d", .... );
    En jouant avec la valeur de retour, tu sauras exactement quel argument n'est pas conforme à ce que tu attends.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci à tous de vos réponses.

    Effectivement mon fichier est formaté donc sscanf parrait la methode la plus simple. Le probleme est que l'orsque je l'ajoute à mon code mes variables ne sont pas bonne et ce qui est contenue dans mon pointeur change.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
      char *Nom1;
      char *Nom2;
      char *Nom3;
      int valeur1;
      int valeur2;
      int valeur3;
      int valeur4;
      int valeur5;
      int valeur6;
      int valeur7;
      int valeur8;
      int valeur9;
      int valeur10;
      int valeur11;
      int valeur12;
      char *FichEnMemoire;
     
     fichier= new Fichier();
     
     if(Initialisation==0)
      {
       OpenDialog1->Execute();
       fichier->Initialiser((OpenDialog1->FileName).c_str());
       Initialisation=1;
      }
     
     FichEnMemoire=fichier->Lire();
     
     sscanf(FichEnMemoire,"%s %d %d %d %d %d %s %d %d %d %d %d %s %d %d"
     ,&Nom1,&valeur1,&valeur2,&valeur3,&valeur4,&valeur5
     ,&Nom2,&valeur6,&valeur7,&valeur8,&valeur9,&valeur10
     ,&Nom3,&valeur11,&valeur12);
     
     
     Edit1->Text=valeur1;
     Edit2->Text=valeur2;
     Edit3->Text=valeur3;
     Edit4->Text=valeur4;
     Edit5->Text=valeur5;
    Et encore merci de m'aider.

  10. #10
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Citation Envoyé par sprite1981
    Merci à tous de vos réponses.

    Effectivement mon fichier est formaté donc sscanf parrait la methode la plus simple. Le probleme est que l'orsque je l'ajoute à mon code mes variables ne sont pas bonne et ce qui est contenue dans mon pointeur change.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
      char *Nom1;
      char *Nom2;
      char *Nom3;
      int valeur1;
      int valeur2;
      int valeur3;
      int valeur4;
      int valeur5;
      int valeur6;
      int valeur7;
      int valeur8;
      int valeur9;
      int valeur10;
      int valeur11;
      int valeur12;
      char *FichEnMemoire;
     
     fichier= new Fichier();
     
     if(Initialisation==0)
      {
       OpenDialog1->Execute();
       fichier->Initialiser((OpenDialog1->FileName).c_str());
       Initialisation=1;
      }
     
     FichEnMemoire=fichier->Lire();
     
     sscanf(FichEnMemoire,"%s %d %d %d %d %d %s %d %d %d %d %d %s %d %d"
     ,&Nom1,&valeur1,&valeur2,&valeur3,&valeur4,&valeur5
     ,&Nom2,&valeur6,&valeur7,&valeur8,&valeur9,&valeur10
     ,&Nom3,&valeur11,&valeur12);
     
     
     Edit1->Text=valeur1;
     Edit2->Text=valeur2;
     Edit3->Text=valeur3;
     Edit4->Text=valeur4;
     Edit5->Text=valeur5;
    Et encore merci de m'aider.
    Oh my gawd

    Pour les parametres de *scanf(), il faut donner l'adresse des zones où *scanf peut écrire
    Pour les chaines, tu donnes l'adresse des pointeurs sur caracteres. Pointeurs qui pointent sur rien, mais le probleme est plus grave :
    Est-ce qu'on peut écrire une chaine dans une variable "char *" ?
    Non.

Discussions similaires

  1. Probleme de parsing de chaine, tronquer une chaine
    Par Voodo'o_d'ool dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 06/08/2008, 11h28
  2. [D7] connaître un type d'exception et la gérer
    Par _alex_ dans le forum Delphi
    Réponses: 3
    Dernier message: 29/08/2006, 13h41
  3. Connaître le type d'un champs d'une table Mysql
    Par xoran dans le forum Langage SQL
    Réponses: 1
    Dernier message: 20/07/2005, 09h29
  4. [POO] Comment connaître le type d'un objet
    Par zizou39 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 01/03/2005, 09h46
  5. [Access] Connaître le type de donnée
    Par Ric1983 dans le forum Bases de données
    Réponses: 4
    Dernier message: 15/02/2005, 19h09

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