Desde ANSI C99 hay _Boolo boolvía stdbool.h. Pero, ¿hay también un printfespecificador 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 _Boolo boolvía stdbool.h. Pero, ¿hay también un printfespecificador 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 booltipos. Sin embargo, dado que cualquier tipo integral más corto de lo que intse promueve intcuando 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 fputslugar 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");
booltipo 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 booles 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));
btoaes "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*xrealmente 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.