128 votes

Spécificateurs de format printf pour uint32_t et size_t

gcc 4.4.4 c89 -Wall -Wextra

J'ai le suivant

 size_t   i = 0;
uint32_t k = 0;

printf("i [ %lu ] k [ %u ]\n", i, k);
 

Je reçois l'avertissement suivant lors de la compilation:

 format ‘%lu' expects type ‘long unsigned int', but argument has type ‘uint32_t'
 

Lorsque j'ai utilisé cette attelle, j'ai obtenu ce qui suit:

 Format argument 1 to printf (%u) expects unsigned int gets size_t: k
 

Merci beaucoup pour tout conseil,

Steve

160voto

KennyTM Points 232647

Essayer

 #include <inttypes.h>
...

printf("i [ %zu ] k [ %"PRIu32" ]\n", i, k);
 

z représente un entier de longueur identique à size_t , et la macro PRIu32 , définie dans l'en-tête C99 inttypes.h , représente un signe non signé. Nombre entier 32 bits.

40voto

Cogwheel Points 8656

On dirait que vous vous attendez à ce que size_t soit identique à unsigned long (éventuellement 64 bits) alors qu'il s'agit en fait de unsigned int (32 bits). Essayez d'utiliser %zu dans les deux cas.

Je ne suis pas tout à fait certain cependant.

33voto

u0b34a0f6ae Points 14874

Tout ce qui est nécessaire, c'est que les spécificateurs de format et le type d'accord, et vous pouvez toujours les lancer pour vous que le vrai. long d'au moins 32 bits, %lu avec (unsigned long)k est toujours correct:

uint32_t k;
printf("%lu\n", (unsigned long)k);

size_t est plus délicat, c'est pourquoi %zu a été ajouté en C99. Si vous ne pouvez pas l'utiliser, alors le traiter comme k (long est le type le plus grand en C89, size_t est très peu probable d'être le plus grand).

size_t sz;
printf("%zu\n", sz);  /* C99 version */
printf("%lu\n", (unsigned long)sz);  /* common C89 version */

Si vous n'obtenez pas les spécificateurs de format correct pour le type que vous êtes de passage, puis printf fera l'équivalent de lecture trop ou trop peu de mémoire hors de la matrice. Aussi longtemps que vous utilisez conversions explicites de faire correspondre les types, il est portable.

20voto

R.. Points 93718

Si vous ne souhaitez pas utiliser le PRI * macros, une autre approche pour l' impression de tout type entier est de jeter à intmax_t ou uintmax_t et l' utilisation "%jd" ou %ju , respectivement. Ceci est particulièrement utile pour les types POSIX (ou autres systèmes d’exploitation) pour lesquels les macros PRI * ne sont pas définies, par exemple off_t .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X