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);
}