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
    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 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    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 026
    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 émérite
    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
    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
    Par défaut
    Encore mieux que le man de sscanf, le tuto : http://xrenault.developpez.com/tutoriels/c/scanf/
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  5. #5
    Membre Expert
    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
    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 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    pourquoi ne pas utiliser strtod ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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, 15h14
  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, 11h20
  3. Séparer les nombres d'une chaine avec split
    Par guano dans le forum Langage
    Réponses: 4
    Dernier message: 16/03/2006, 17h14
  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, 16h54
  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, 14h50

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