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 les nombres d'une chaine de caractères ?


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Récupérer les nombres d'une chaine de caractères ?
    Bonjour,
    Je récupère par UDP une chaine de caractère composé de réelles séparés par des virgules.
    Je voudrais récupérer dans un tableau de double ces chiffres (sans les virgules).
    Pour convertir un char en double, je dois utiliser atof (sauf erreur de ma part).
    Mon problème est que je n'arrive pas à récupérer et stocker chaque chiffre entre virgules.

    Par exemple :
    - Si je recois par UDP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    maChaineUdp = "23.165313, 2.461, 789.1131323123 etc...";
    - Je voudrais avoir :
    chiffreRecu[0] = 23.165313;
    chiffreRecu[1] = 2.461;
    chiffreRecu[2] = 789.1131323123;
    etc... ;

    Comment faire SVP je n'y arrive vraiment pas ?
    Merci.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 137
    Points
    23 137
    Par défaut
    Bonjour,
    as-tu essayé d'utiliser sscanf ?

    http://man.developpez.com/man3/scanf.3.php

    Sinon, c'est étrange que tu reçoit les données en chaînes de caractères.
    Pourquoi ne pas les envoyer en binaire? Tu gagneras au niveau de la taille du paquet UDP.

  3. #3
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Bonjour,

    Il y a une possibilité, mais il te faut rechercher les séparateurs manuellement.
    Voici un bout de code qui doit normalement fonctionner (dsl, il n'est pas très propre )
    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
            const char *maChaineUdp = "23.165313, 2.461, 789.1131323123, 41.23, 58., 0.\n" ;
            float nombreRecu[20] ;
            int nbNombreRecu = 0 ;
     
            // Pointeur sur un séparateur
            char *ptrSeparateur = (char*)maChaineUdp ;
     
            do {
                float value = 0. ;
     
                // Si valeur trouvée, l'attribuer au tableau ...
                if(sscanf(ptrSeparateur, "%f", &value)==1)
                    nombreRecu[nbNombreRecu++] = value ;
                // Sinon sortie de la boucle
                else break ;
     
                // Recherche du séparateur valide (ici une virgule)
                ptrSeparateur = strchr(ptrSeparateur, ',') ;
                // Si trouvé, ptrSeparateur doit pointer sur le caractère suivant
                if(ptrSeparateur!=NULL) ptrSeparateur++ ;
     
                // Recommencer tant qu'il y a des séparateurs et des cellules de libre
            } while(ptrSeparateur!=NULL && nbNombreRecu<20) ;
     
            // Affichage
            if(nbNombreRecu) {
                int i ;
     
                printf("Il y a %d nombres trouvés :\n", nbNombreRecu) ;
                for(i=0; i<nbNombreRecu; i++)
                    printf("\tnombreRecu[%d] = %g\n", i, nombreRecu[i]) ;
            }
            else
                printf("Aucun nombre n'a été trouvé !\n") ;
    Bonne continuation.

  4. #4
    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 129
    Points
    28 129
    Par défaut
    Encore mieux que le man de sscanf, le tuto : http://xrenault.developpez.com/tutoriels/c/scanf/

  5. #5
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Citation Envoyé par Neckara Voir le message
    c'est étrange que tu reçoit les données en chaînes de caractères.
    C'est la façon la plus courante de s'affranchir de l'endianness, tant pour les entiers que pour les flottants. Mais je n'ai pas assez de culture réseau pour avoir une idée de ce cas précis.

    A+

    Pfeuh

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 131
    Points : 33 074
    Points
    33 074
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    pourquoi ne pas utiliser strtod ?

Discussions similaires

  1. Récupérer tous les mots d'une chaine de caractère
    Par steps5ive dans le forum Access
    Réponses: 2
    Dernier message: 05/09/2006, 16h14
  2. eliminer les espaces d'une chaine de caractères
    Par wassim_kh dans le forum Langage
    Réponses: 1
    Dernier message: 14/07/2006, 12h20
  3. Séparer les nombres d'une chaine avec split
    Par guano dans le forum Langage
    Réponses: 4
    Dernier message: 16/03/2006, 18h14
  4. [MySQL] extraire des nombre d'une chaine de caractères et addition
    Par Yotho dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 04/03/2006, 17h54
  5. Récuperer un nombre dans une chaine de caractère
    Par ColonelHati dans le forum C
    Réponses: 4
    Dernier message: 27/04/2005, 15h50

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