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 :

Problème spécificateur dans chaîne de format


Sujet :

C

  1. #1
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 359
    Points : 738
    Points
    738
    Billets dans le blog
    2
    Par défaut Problème spécificateur dans chaîne de format
    Bonjour,

    jai un problème de format dans les fonctions snprintf (ligne: 60, 62, 65, 69, 71), le compilateur (gcc) ne reconnait pas le spécificateur 'll' (il affiche un warning).
    Je me suis reporté au standad C qui me dit ça:
    ll (ell-ell)
    Specifies that a following d, i, o, u, x, or X conversion specifier applies to a
    long long int or unsigned long long int argument; or that a
    following n conversion specifier applies to a pointer to a long long int
    argument.
    Est-ce un problème qui vient du compilateur ou est-ce que quelque chose m'échappe.

    Merci d'avance.

    Code C : 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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <string.h>
     
    #define TOKEN_STR_SIZE    128
    #define TOKEN_NAN         0
    #define TOKEN_INTEGER     1
     
    /*
    ** La fonction utilise une double conversion pour déterminer
    ** le type du jeton qui lui est passé. Si, après les conversions chaîne vers
    ** nombre et nombre vers chaîne, la chaîne d'entrée est égale à la chaîne
    ** de sortie alors le jeton est nombre sous forme de chaîne de caractère.
    */
    int main(int argc, char *argv[])
    {
      char      *token, str_integer[TOKEN_STR_SIZE];
      long long nb_integer;
      int       i, base, shift;
     
      if (argc == 2)
        token = argv[1];
      else
        return(-1);
     
      fprintf(stdout, "Token:      '%s'\n", token);
     
      /* Définition du décallage par défaut */
      shift = 0;
     
      /* Initialisation des tampons pour les chaînes de sortie */
      for (i = 0; i < TOKEN_STR_SIZE; i++)
        str_integer[i] = 0;
     
      for (i = 0; token[i] != 0; i++)
        token[i] = tolower(token[i]);
     
      /* Test la présence de l'opérateur unaire '-' */
      if (token[0] == '-')
        shift = 1;
      /* Détermination de la base du système de numération */
      if (token[shift++] == '0')
      {
        if (token[shift] == 'x')
          base = 16;
        else if (token[shift] >= '0' && token[shift] <= '7')
          base = 8;
        else
          base = 0;
      }
      else
        base = 10;
     
      if (base == 0)
        return(-2);
     
      /* Chaîne vers nombre entier */
      nb_integer = strtoll(token, NULL, base);
      /* Nombre entier vers chaîne */
      if (shift == 2 && (base == 8 || base == 16))
        nb_integer = -nb_integer;
      if (base == 8)
      {
        if (shift == 2)
          snprintf(str_integer, TOKEN_STR_SIZE, "-0%llo", nb_integer);
        else
          snprintf(str_integer, TOKEN_STR_SIZE, "0%llo", nb_integer);
      }
      else if (base == 10)
        snprintf(str_integer, TOKEN_STR_SIZE, "%lld", nb_integer);
      else if (base == 16)
      {
        if (shift == 2)
          snprintf(str_integer, TOKEN_STR_SIZE, "-0x%llx", nb_integer);
        else
          snprintf(str_integer, TOKEN_STR_SIZE, "0x%llx", nb_integer);
      }
     
      fprintf(stdout, "Integer:    '%s'\n", str_integer);
     
      if (strcmp(token,str_integer) == 0)
      {
        fprintf(stdout, "\nC'est un nombre entier en base '%d'.\n", base);
        return(TOKEN_INTEGER);
      }
     
      return(TOKEN_NAN);
    }

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 038
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 038
    Points : 8 405
    Points
    8 405
    Par défaut
    salut,

    si je dis pas de bêtise ça tient à la fois au compilateur et au système/la libc, avec gcc par contre %llx devrait fonctionner, de mémoire c'est sous windows qu'il fallait utiliser un truc du genre %I64x

  3. #3
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 359
    Points : 738
    Points
    738
    Billets dans le blog
    2
    Par défaut
    Ok merci, je vais tester.

  4. #4
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 359
    Points : 738
    Points
    738
    Billets dans le blog
    2
    Par défaut
    Merci.

    Sous Windows, Code::Blocks (et donc gcc) utilise bel et bien %I64x comme spécificateur au lieu de %llx. Est-ce que tu as une idée de là où je pourrais trouver plus de détails sur le sujet?

  5. #5
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 359
    Points : 738
    Points
    738
    Billets dans le blog
    2

Discussions similaires

  1. Réponses: 19
    Dernier message: 13/02/2013, 16h21
  2. [Tableaux] Problème avec remplacement dans chaîne
    Par Baptiste Wicht dans le forum Langage
    Réponses: 5
    Dernier message: 13/07/2006, 10h04
  3. problème debodybackground dans une page php
    Par bertrand_declerck dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 04/02/2005, 22h39
  4. Problème alinéa dans textarea
    Par guitaros dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 23/12/2004, 00h07
  5. Problème formatage dans balise title / alt
    Par jflebegue dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 09/12/2004, 15h18

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