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 :

Parser une chaine en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    2 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 2 037
    Par défaut Parser une chaine en C
    Bonjour

    Je reçois des chaines de caractère issues d'un fichier ini et j'ai besoin de les analyser pour traitement.
    Pour récupérer la valeur du paramètre reçu j'ai trouvé strchar qui me donne le contenu de la chaine après le '='
    mon soucis est que j'ai aussi besoin de ce qui est avant le '=' pour connaitre la paramètre à traiter (et vérifier que je connais ce paramètre)
    quelle peut être la fonction ad hoc pour ça ?

    pour être plus précis mes lignes ne sont pas exactement des INI standard, je reçois des lignes comme ceci :
    23:Nom du parametre=5465.5454
    le 23 au début est un numéro de paramètre
    idéalement il me faudrait donc récupérer 3 chaines :
    23 -> qui je transformerai en unsigned short qui me servira a retrouver le paramètre dans mon application
    Nom du paramètre -> qui me servira à vérifier que l'on parle bien du même paramètre '23'
    5465.5454 -> que je transformerai en float, c'est la valeur du paramètre

    Merci

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 036
    Par défaut
    En utilisant fscanf

  3. #3
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    868
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 868
    Par défaut
    Il t'est aussi possible d'utiliser la fonction strchr. Petit exemple (vite fait de tête donc je garantis rien !) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    char *get_sub_part(const char *ta_string, char sep) {
        int length = strchr(ta_string, sep) - ta_string;
     
        if (length > 0) {
            return strndup(ta_string, length);
        }
        return NULL;
    }
     
    char *ta_string = "1:hey=12";
    char *part1 = get_sub_part(ta_string, ':'); // "1"
    char *part2 = get_sub_part(ta_string + strlen(part1) + 1, '='); // "hey"
    char *part3 = strdup(ta_string + strlen(part2) + 1); // "12"
    Ne pas oublier de free tout ça.

  4. #4
    Membre extrêmement actif Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    2 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 2 037
    Par défaut
    ok, compris strchr (c'est la fonction que j'avais cité en premier et mal noté (strcha))
    l'idée est de faire des soustraction sur les adresses des pointeurs pour retrouver les positions dans la chaine... ca parait tellement simple que je n'y avais pas pensé.

    mais ce fscanf semble enormissime !
    on donne le format attendu et hop il rempli tous les éléments ?
    genre pour 23:Nom parametre=323223.5454 je donne fscanf(Machaine,"%d:%s=%f, &MonNumleroDeParametre, &MonNomDeParametre, &Mavaleur) et d'un coup il me trouve un decimal, une chaine et un float ?

    je fonce tester cet engin de guerre

    Merci

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 036
    Par défaut
    fscanf semble une solution adéquate à ton problème, en effet...

  6. #6
    Membre extrêmement actif Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    2 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 2 037
    Par défaut
    Re

    depuis tout à l'heure je me bas avec fscanf et je n'arrive rien a en faire
    j'ai tenté de faire simple avec ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    const char *MonTexte2 = "23 NomParamètre 4345.54";
    	unsigned short MonNumeroDeParametre;
    	char MonNomDeParametre[200]; //!!!!verifier que le nom fait bien moins de 200 caractères sinon plantage
    	float Mavaleur;
    	int status;
     
    status = fscanf(MonTexte2,"%d %s %f", &MonNumeroDeParametre, &MonNomDeParametre, &Mavaleur);
     
    	printf("%d\n",status);
    	printf("%d\n",MonNumeroDeParametre);
    	printf("%s\n",MonNomDeParametre);
    	printf("%f\n",Mavaleur);
    et ca me sort un status = -1 ( je suppose que c'est pas top) et mes 3 sorties ont des valeurs débiles

    avant de tester ce code "plus simple" je suis arrivé au meme echec avec mon besoin d'origine à savoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const char *MonTexte = "23:Nom paramètre=4345.54";
    status = fscanf(MonTexte,"%d[^:]:%s[^=]=%f", &MonNumeroDeParametre, &MonNomDeParametre, &Mavaleur);
    j'ai cru comprendre que le [^:] voulait dire "convertir ce qui va jusqu'au caractère :"

    mais manifestement il y a un truc de base que je n'ai pas pigé :-(

    Merci

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

Discussions similaires

  1. Parser une chaine de caractère
    Par Nasky dans le forum C++
    Réponses: 7
    Dernier message: 04/12/2006, 19h37
  2. Parser une chaine de doubles
    Par Ange44 dans le forum C++
    Réponses: 9
    Dernier message: 28/06/2006, 13h12
  3. Réponses: 9
    Dernier message: 30/11/2005, 18h18
  4. Parser une chaine
    Par TieumB dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/01/2005, 11h20
  5. Parser une chaine en shell script
    Par Gogoye dans le forum Linux
    Réponses: 10
    Dernier message: 19/07/2004, 17h49

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