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

Langage C++ Discussion :

Il est bon ce sscanf() ?


Sujet :

Langage C++

  1. #1
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut Il est bon ce sscanf() ?
    Bonjour,

    Voici un 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
    #include <array>
    #include <iostream>
     
    int main() {
     
    	std::string str("11:22:33:aa:bb:cc");
    	std::array<std::uint8_t, 6> macAddress;
     
    	auto n = sscanf(str.c_str(), "%2hhx:%2hhx:%2hhx:%2hhx:%2hhx:%2hhx",
    					&macAddress[0], &macAddress[1], &macAddress[2],
    					&macAddress[3], &macAddress[4], &macAddress[5]);
     
    	std::cout << std::hex << n << std::endl;
    }
    Ce code fonctionne très bien sur mon PC avec mingw64. Il affiche 6.

    Il ne fonctionne pas avec une autre toolchain pour embarqué (arm-none-eabi-gcc), le résultat est 1. En revanche, le résultat est correct si j'utilise %2x comme format, bien que le compilateur émette des warnings car les variables ne sont pas du type attendu.

    Les deux sont dans des versions similaires de gcc (7.quelque chose). Bug de toolchain ? Undefined behavior ? Un truc qui m'échappe ?

    Merci pour vos lumières !

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    À ma connaissance, %2hhx devrait marcher mais nécessite au minimum C99.
    Au niveau de C++, j'ignore à partir de quelle norme hh est pris en compte, mais j'ose espérer que C++11 le supporte...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    On utilise C++17 pour info.

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Le %2hhx doit fonctionner depuis le C++11. Il correspond à un type char, signed char ou unsigned char. Et la présence du std::array<> et du auto confirme que le compilateur est au moins C++11.
    Le %2x n'est surtout pas à utiliser. Le warning signale l'erreur car la destination sera supposée être de la taille d'un int. Ça déborde!!
    Le format à utiliser pour un std::uint8_t est plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <cstdint>
    sscanf( str.c_str() , "%2" SCNx8 ":%2" SCNx8 ":%2" SCNx8 ":%2" SCNx8 ":%2" SCNx8 ":%2" SCNx8,
        &macAddress[0], &macAddress[1], &macAddress[2],&macAddress[3], &macAddress[4], &macAddress[5]);
    Je ne vois pas pourquoi une compilation ARM pourrait avoir un soucis empêchant de gérer les char.

    Le problème peut être contourné, en écrivant comme en C++.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        std::array<std::uint8_t, 6>  macAddress;
        std::istringstream  isst( str );   // flux de lecture de la chaîne
     
        isst >> std::hex;   // mode hexa
        for ( auto& x : macAddress ) {
            isst >> std::setw(2) >> x; // lit 2 caractères hexa copiés dans x
            isst.get();      // saute le caractère ':'
        }

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/02/2007, 09h11
  2. [Tableaux] Mon code est bon ?
    Par garaut dans le forum Langage
    Réponses: 8
    Dernier message: 14/11/2006, 15h47
  3. [Dates] calcul de date est ce que mon code est bon?
    Par carmen256 dans le forum Langage
    Réponses: 2
    Dernier message: 09/06/2006, 11h30
  4. [Jeu "Le Compte est Bon"] Recherche algorithme
    Par Chriss21 dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 29/10/2005, 16h10

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