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 :

Récupérer des données dans une chaîne de caractère en C


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 46
    Points : 34
    Points
    34
    Par défaut Récupérer des données dans une chaîne de caractère en C
    Bonjour à tous;

    Je souhaiterais récupérer des informations contenus dans une chaîne de caractères en c

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *chaine = "REQ1|55|25|20080717|15:00:52|TRACE1|20080719|";
    Je me suis penché vers un sscanf pour récupérer toutes mes infos seulement vu que chaque donnée est séparée par un pipe c'est un peu difficile enfin pour moi en tout cas d'où ma présence sur ce forum.

    Je souhaiterais savoir si quelqu'un connait le moyen de récupérer que les données entre les pipes (|donnees|)


    Typiquement dans mon cas par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char *donnee_1, *donnee_2,*donnee_3,*donnee_4,*donnee_5;
    int val_1, val_2;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sscanf(chaine, "%s %d %d %s %s %s %s", donnee_1,&val_1,&val_2,donnee_2,donnee_3,donnee_4,donnee_5);
    au final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    *donnee_1 = "REQ1";
    *donnee_2 = "20080717";
    *donnee_3 = "15:00:52";
    *donnee_4 = "TRACE1";
    *donnee_5 = "20080719";
     
    val_1 = 55;
    val_2 = 25;
    Merci à tous

  2. #2
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    Bonjour,

    en utilisant strtok et strtod (pour la conversion en int) ca soit se faire rapidement ca.
    "vaste programme"

  3. #3
    Scorpi0
    Invité(e)
    Par défaut
    Exemple trouvé sur le site de msdn qui ressemble à ce que tu veux :

    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
     
    // crt_sscanf_s.c
    // This program uses sscanf_s to read data items
    // from a string named tokenstring, then displays them.
     
    #include <stdio.h>
     
    int main( void )
    {
       char  tokenstring[] = "15 12 14...";
       char  s[81];
       char  c;
       int   i;
       float fp;
     
       // Input various data from tokenstring:
       // max 80 character string plus NULL terminator
       sscanf_s( tokenstring, "%s", s, sizeof(s) ); 
       sscanf_s( tokenstring, "%c", &c, sizeof(char) );
       sscanf_s( tokenstring, "%d", &i );
       sscanf_s( tokenstring, "%f", &fp );
     
       // Output the data read
       printf_s( "String    = %s\n", s );
       printf_s( "Character = %c\n", c );
       printf_s( "Integer:  = %d\n", i );
       printf_s( "Real:     = %f\n", fp );
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Output
     
    String    = 15
    Character = 1
    Integer:  = 15
    Real:     = 15.000000
    A toi de l'adapter.

    PS : J'ai beaucoup rigolé en voyant visual 2005 me dire "warning C4996: 'sscanf' a été déclaré désapprouvé".

    Bel utilisation de langage

    Edit : en fait bof, ca ressemble pas tant que ca ^^
    Dernière modification par Scorpi0 ; 17/07/2008 à 15h25.

  4. #4
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Si le format de ta chaîne ne varie pas ( le nombre de données leurs tailles ... ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sscanf(chaine, "%4s|%2d|%2d|%8s|%8s|%6s|%8s", donnee_1,&val_1,&val_2,donnee_2,donnee_3,donnee_4,donnee_5);
    Tout fois il faut bien allouer de la mémoire pour des chaines de caractères 'donnee_X' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #define BUFFSIZE 32
    <...>
     char donnee_1[BUFFSIZE],
            donnee_2[BUFFSIZE],
            donnee_3[BUFFSIZE],
            donnee_4[BUFFSIZE],
            donnee_5[BUFFSIZE];
    Pour ce qui est du strtok d'aprés le man :
    Citation Envoyé par http://man.developpez.com/man3/strtok.3.php
    <...>
    Cette fonction ne doit pas être invoquée sur une chaîne constante.
    <...>
    Et c'est le cas ! A prendre en considération
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  5. #5
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    certes c'est le cas dans l exemple mais j espere que Info_76 ne s'amuse pas a coder cette string en dur pour ensuite la spitter, transformer certains param en int... dans plusieurs tites variables.

    sinon ben sinon... je sais meme pas quoi dire
    "vaste programme"

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/08/2008, 09h58
  2. Récupérer des données dans une phrase txt
    Par sophie78 dans le forum MATLAB
    Réponses: 20
    Dernier message: 05/07/2007, 17h27
  3. Réponses: 6
    Dernier message: 18/10/2006, 16h34
  4. [RegEx] Récupérer des données dans une page Web
    Par Pragmateek dans le forum Langage
    Réponses: 8
    Dernier message: 24/05/2006, 19h44
  5. Récupérer des données dans une page HTML
    Par newdelirium dans le forum Langage
    Réponses: 3
    Dernier message: 26/10/2005, 19h18

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