Desde ANSI C99 hay _Bool
o bool
vía stdbool.h
. Pero, ¿hay también un printf
especificador de formato para bool?
Me refiero a algo como en ese pseudocódigo:
bool x = true;
printf("%B\n", x);
que imprimiría:
true
Desde ANSI C99 hay _Bool
o bool
vía stdbool.h
. Pero, ¿hay también un printf
especificador de formato para bool?
Me refiero a algo como en ese pseudocódigo:
bool x = true;
printf("%B\n", x);
que imprimiría:
true
Respuestas:
No hay un especificador de formato para los bool
tipos. Sin embargo, dado que cualquier tipo integral más corto de lo que int
se promueve int
cuando se pasa a printf()
los argumentos variados, 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?
printf("%s", x ? "true" : "false");
solucionaría el problema
printf("%s", x ? "true" : "false");
es mejor eso printf(x ? "true" : "false");
: usted tiene el control total de la cadena de formato aquí, por lo que no hay peligro de que obtenga algo como "%d"
lo que causaría problemas. El fputs
, por otro lado, es una mejor opción.
fputs
"aún mejor"? Siempre estoy buscando formas de mejorar mi C. ¿En qué circunstancias debo usar en fputs
lugar de printf
?
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 elegante:
printf("%s", x?"true":"false");
bool
tipo en C, pero no en la edición C89 - es parte de la especificación lenguaje C99. Hay una nueva palabra clave _Bool
, y si la incluye <stdbool.h>
, entonces bool
es sinónimo de _Bool
.
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 es una extensión glibc, el GCC advierte sobre ese especificador personalizado:
$ gcc -Wall -g main.c -o main main.c: En la función 'main': main.c: 34: 3: advertencia: carácter de tipo de conversión desconocido 'B' en formato [-Wformat =] r = printf ("El resultado es:% B \ n", b); ^ main.c: 34: 3: advertencia: demasiados argumentos para el formato [-Wformat-extra-args]
Salida:
$ ./main El resultado es: falso (escrito 21 caracteres) $ ./principal 1 El resultado es: verdadero (escrito 20 caracteres)
En la tradición de itoa()
:
#define btoa(x) ((x)?"true":"false")
bool x = true;
printf("%s\n", btoa(x));
btoa
es "cadena binaria a cadena base 64" en JavaScript no estándar (Gecko y WebKit), por lo que es posible que desee utilizar un nombre diferente.
"true\0false"[(!x)*5]
:-)
!!x*5
.
Si te gusta C ++ mejor que C, puedes probar esto:
#include <ios>
#include <iostream>
bool b = IsSomethingTrue();
std::cout << std::boolalpha << b;
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);
"false\0true"+6*x
realmente hacía. Si trabaja en un proyecto con otras personas, o simplemente en un proyecto con una base de código que desea comprender x años más tarde, se evitarán construcciones como esta.
printf("%s\n","false\0true"+6*(x?1:0));
solo 5% menos legible.
static inline char const *bool2str(_Bool b) { return "false\0true"+6*x; } int main(void) { printf("%s != %s", bool2str(false), bool2str(true)); return 0; }
Igual que con static inline char decimal2char(int d) { assert(d >= 0 && d <= 9); return '0' + d; }
; simplemente envuélvalo en una función con nombre descriptivo y no se preocupe por su legibilidad.