c c99 literals compound-literals

¿Cómo usar literales compuestos para `fprintf()` números formateados múltiples con bases arbitrarias?



c99 literals (1)

Me gustaría convertir varios números en alguna representación y luego usar las banderas, el ancho y la precisión de los especificadores *printf() . La preferencia sería evitar buffers globales o static . El problema clave parece ser: ¿cómo proporcionar un char[] para cada uno de los números convertidos?

fprintf(ostream, "some_format", foo(int_a, base_x), foo(int_b, base_y), ...);

¿Cómo usar literales compuestos C11 para resolver esto?
¿Cómo usar los literales compuestos C99 (o posteriores) para resolver esto?


C99 C11 introdujo literales compuestos que permiten no solo una estructura inicializada complicada, sino también una variable "en línea".

El código puede llamar a una función de conversión y pasar un nuevo búfer (char [UTOA_BASE_N]){0} por cada llamada a la función, lo que permite que la función devuelva el mismo búfer, ahora escrito según sea necesario, que todavía está dentro de su vida útil . La cadena devuelta se imprime utilizando varios indicadores, ancho y precisión disponibles para el especificador "%s" .

#include <stdio.h> #include <stdlib.h> #include <limits.h> // Maximum buffer size needed #define UTOA_BASE_N (sizeof(unsigned)*CHAR_BIT + 1) char *utoa_base(char *s, unsigned x, unsigned base) { s += UTOA_BASE_N - 1; *s = ''/0''; if (base >= 2 && base <= 36) { do { *(--s) = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[x % base]; x /= base; } while (x); } return s; } #define TO_BASE(x,b) utoa_base((char [UTOA_BASE_N]){0} , (x), (b)) void test(unsigned x) { printf("base10:%10u base2:%5s base36:%s ", x, TO_BASE(x, 2), TO_BASE(x, 36)); printf("%lu/n", strtoul(TO_BASE(x, 36), NULL, 36)); } int main(void) { test(0); test(25); test(UINT_MAX); }

Salida

base10: 0 base2: 0 base36:0 0 base10: 25 base2:11001 base36:P 25 base10:4294967295 base2:11111111111111111111111111111111 base36:1Z141Z3 4294967295

Ref: ¿Hay un convertidor printf para imprimir en formato binario? tiene varias respuestas, pero ninguna de ellas permite la administración de memoria simple (no static ) de lo anterior con acceso a fprintf() ancho de banderas, precisión y uso del rango completo del número.

Esta es una respuesta a su propia pregunta .