lenguaje - especificadores de formato printf para uint32_t y size_t
printf y scanf en dev c++ (4)
Parece que está esperando que size_t
sea lo mismo que unsigned long
(posiblemente 64 bits) cuando en realidad es unsigned int
(32 bits). Intenta usar %zu
en ambos casos.
Aunque no estoy del todo seguro.
Tengo lo siguiente
size_t i = 0;
uint32_t k = 0;
printf("i [ %lu ] k [ %u ]/n", i, k);
Recibo la siguiente advertencia al compilar:
format ‘%lu’ expects type ‘long unsigned int’, but argument has type ‘uint32_t’
Cuando ejecuté esto usando una férula obtuve lo siguiente:
Format argument 1 to printf (%u) expects unsigned int gets size_t: k
Muchas gracias por cualquier consejo,
Si no desea utilizar las macros PRI *, otro método para imprimir CUALQUIER tipo entero es convertir a intmax_t
o uintmax_t
y usar "%jd"
o %ju
, respectivamente. Esto es especialmente útil para los tipos POSIX (u otro sistema operativo) que no tienen macros PRI * definidas, por ejemplo off_t
.
Todo lo que se necesita es que los especificadores de formato y los tipos estén de acuerdo, y siempre se puede convertir para que eso sea cierto. long
es al menos 32 bits, por lo que %lu
junto con (unsigned long)k
es siempre correcto:
uint32_t k;
printf("%lu/n", (unsigned long)k);
size_t
es más complicado, por lo que se agregó %zu
en C99. Si no puedes usar eso, trátalo como k
( long
es el tipo más grande en C89, size_t
es muy poco probable que sea más grande).
size_t sz;
printf("%zu/n", sz); /* C99 version */
printf("%lu/n", (unsigned long)sz); /* common C89 version */
Si no obtiene los especificadores de formato correctos para el tipo que está pasando, entonces printf
hará el equivalente de leer demasiada o muy poca memoria fuera de la matriz. Siempre que use conversiones explícitas para hacer coincidir tipos, es portátil.
Tratar
#include <inttypes.h>
...
printf("i [ %zu ] k [ %"PRIu32" ]/n", i, k);
z
representa un número entero de longitud igual que size_t
, y la macro PRIu32
, definida en el encabezado C99 inttypes.h
, representa un entero de 32 bits sin signo.