¿Cuál es la forma correcta de usar printf para imprimir un size_t?

3 minutos de lectura

¿Cual es la forma correcta de usar printf para imprimir
bradtgmurray

Size_t se define como un unsigned entero, pero su tamaño depende de si está en una máquina de 32 o 64 bits. ¿Cuál es la forma correcta y portátil de imprimir un size_t?

  • ¿Posible duplicado de cadena de formato multiplataforma para variables de tipo size_t?

    – Ciro Santilli Путлер Капут 六四事

    2 oct 2015 a las 9:31

  • @CiroSantilli六四事件法轮功纳米比亚威视 Lo dejo abierto porque el duplicado contiene algunas respuestas incorrectas, mientras que este tiene una respuesta bien aceptada.

    – edmz

    2 oct 2015 a las 17:41

  • @black también puedes proponer cerrar de otra manera. Cualquiera de los dos está bien para mí.

    – Ciro Santilli Путлер Капут 六四事

    2 oct 2015 a las 18:53


1647551527 61 ¿Cual es la forma correcta de usar printf para imprimir
jaredpar

Intenta usar el %zu cadena de formato

size_t val = get_the_value();
printf("%zu",val);

La porción z es un especificador de longitud que dice que el argumento tendrá una longitud de tamaño_t.

Fuente – http://en.wikipedia.org/wiki/Printf#printf_format_placeholders

  • size_t es un tipo sin firmar, por lo que aún debe usar ‘u’ como tipo de formato, así como el modificador de longitud ‘z’.

    –CB Bailey

    2 de junio de 2009 a las 15:20

  • Además, el modificador ‘z’ es una adición de C99 a printf, por lo que no es estrictamente una característica estándar de C++.

    –CB Bailey

    2 de junio de 2009 a las 15:28

  • @Charles corrigió la parte u y agregué una etiqueta C al comienzo. Esperaría que esto sea mucho más una característica de C que C ++, ya que C ++ puede seguir la ruta cout.

    – JaredPar

    2 de junio de 2009 a las 15:48

  • Mi compilador (gcc) da una advertencia: unknown conversion type character 'z' in format [-Wformat]|y cuando el programa se ejecuta, simplemente imprime zu como la salida

    –Edward Karak

    01/09/2015 a las 23:31

  • @Ruslan por esa razón se han introducido argumentos posicionales. Consulte stackoverflow.com/questions/6322540/… . Si se usan, su preocupación no es aplicable.

    –Kinstein

    12/10/2017 a las 14:35


Hay una etiqueta de C++ en esto, así que cout << es otra respuesta posible.

Esto es sorprendentemente difícil de hacer bien en todas las versiones de C. En C90, convertir a unsigned long debería funcionar, pero es posible que no funcione en C99, y las soluciones de C99 no necesariamente funcionarán en C90. La capacidad de distinguir de manera confiable entre C90 y C99 se introdujo en los cambios de 1995 (que especifican los valores permitidos para __STDC__). No creo que haya una forma completamente portátil que funcione para C90, C99 y C++, aunque hay soluciones para cualquiera de ellas.

Creo que la respuesta de C++ es:

std::size_t n = 1;
std::cout << n;

Para E/S estilo C es un poco más complicado. En C99 agregaron el z modificador de longitud para size_t valores. Sin embargo, antes de TR1, esto no es compatible, por lo que le queda la conversión a un tamaño específico como:

std::size_t n = 1;
std::printf("%lu\n", static_cast<unsigned long>(n));

Entonces otra vez, unsigned long long no es realmente compatible con C ++ de todos modos, por lo que lo anterior funcionará bien ya que unsigned long es el tipo integral legal más grande. Después de TR1 puedes usar %zu con seguridad para size_t valores.

  • ¿Cómo es que C ++ no admite unsigned long long? Si se basa en el tamaño de ser el mismo en algunas plataformas, no es lo mismo que no sea compatible. Tenga en cuenta que tuve una reacción muy mala a C++ (incluso además lo encuentro horrible) y me encanta C, pero no he encontrado un compilador de C++ que no admita unsigned durante mucho tiempo. Y ciertamente es compatible con uint64_t.

    – Priftan

    3 de diciembre de 2019 a las 15:25

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad