turbo sprintf c printf

sprintf - ¿Cuál es el especificador de formato printf para bool?



sprintf c (8)

ANSI C99 / C11 no incluye un especificador de conversión de printf adicional para bool .

Pero la biblioteca GNU C proporciona una API para agregar especificadores personalizados .

Un ejemplo:

#include <stdio.h> #include <printf.h> #include <stdbool.h> static int bool_arginfo(const struct printf_info *info, size_t n, int *argtypes, int *size) { if (n) { argtypes[0] = PA_INT; *size = sizeof(bool); } return 1; } static int bool_printf(FILE *stream, const struct printf_info *info, const void *const *args) { bool b = *(const bool*)(args[0]); int r = fputs(b ? "true" : "false", stream); return r == EOF ? -1 : (b ? 4 : 5); } static int setup_bool_specifier() { int r = register_printf_specifier(''B'', bool_printf, bool_arginfo); return r; } int main(int argc, char **argv) { int r = setup_bool_specifier(); if (r) return 1; bool b = argc > 1; r = printf("The result is: %B/n", b); printf("(written %d characters)/n", r); return 0; }

Como se trata de una extensión de glibc, el GCC advierte sobre ese especificador personalizado:

$ gcc -Wall -g main.c -o main main.c: In function ‘main’: main.c:34:3: warning: unknown conversion type character ‘B’ in format [-Wformat=] r = printf("The result is: %B/n", b); ^ main.c:34:3: warning: too many arguments for format [-Wformat-extra-args]

Salida:

$ ./main The result is: false (written 21 characters) $ ./main 1 The result is: true (written 20 characters)

Desde ANSI C99 hay _Bool o bool través de stdbool.h . Pero, ¿hay también un especificador de formato printf para bool?

Me refiero a algo así como en ese pseudo código:

bool x = true; printf("%B/n", x);

que imprimiría:

true


En la tradición de itoa() :

#define btoa(x) ((x)?"true":"false") bool x = true; printf("%s/n", btoa(x));


No hay Pero como cualquier tipo de integral más corto que int se promueve a int cuando se transmite a los argumentos variadic de printf() s, puede usar %d :

bool x = true; printf("%d/n", x); // prints 1

Pero por qué no

printf(x ? "true" : "false");

o mejor

printf("%s", x ? "true" : "false");

o mejor

fputs(x ? "true" : "false", stdout);

¿en lugar?


No hay un especificador de formato para bool. Puede imprimirlo utilizando algunos de los especificadores existentes para imprimir tipos integrales o hacer algo más sofisticado:

printf("%s", x?"true":"false");


No puedes, pero puedes imprimir 0 o 1

_Bool b = 1; printf("%d/n", b);

source


Para imprimir solo 1 o 0 según el valor booleano que acabo de usar:

printf("%d/n", !!(42));

Especialmente útil con las banderas:

#define MY_FLAG (1 << 4) int flags = MY_FLAG; printf("%d/n", !!(flags & MY_FLAG));



Si te gusta C ++ mejor que C, puedes probar esto:

#include <ios> #include <iostream> bool b = IsSomethingTrue(); std::cout << std::boolalpha << b;