sintaxis lenguaje ejemplos dev bool c printf

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.