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.