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");
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));
Prefiero una respuesta de Mejor manera de imprimir el resultado de un bool como ''falso'' o ''verdadero'' en c? , al igual que
printf("%s/n", "false/0true"+6*x);
- x == 0, "false / 0true" + 0 "significa" false ";
- x == 1, "false / 0true" + 6 "significa" true ";
Si te gusta C ++ mejor que C, puedes probar esto:
#include <ios>
#include <iostream>
bool b = IsSomethingTrue();
std::cout << std::boolalpha << b;