Quel est le spécificateur de format printf pour bool?
depuis ANSI C99 il y a _Bool
ou bool
via stdbool.h
. Mais y a-t-il aussi un spécificateur de format printf
pour bool?
je veux dire quelque chose comme dans ce pseudo code:
bool x = true;
printf("%Bn", x);
qui écrirait:
true
8 réponses
il n'y en a pas. Mais puisque n'importe quel type intégral plus court que int
est promu à int
quand transmis à printf()
arguments variadiques, vous pouvez utiliser %d
:
bool x = true;
printf("%d\n", x); // prints 1
mais pourquoi pas
printf(x ? "true" : "false");
ou mieux
printf("%s", x ? "true" : "false");
ou même mieux
fputs(x ? "true" : "false", stdout);
à la place?
il n'y a pas de spécificateur de format pour bool. Vous pouvez l'imprimer en utilisant certains des spécificateurs existants pour l'impression de types intégraux ou faire quelque chose de plus sophistiqué:
printf("%s", x?"true":"false");
ANSI C99/C11 ne disposent pas d'un extra printf indicateur de conversion pour bool
.
mais la bibliothèque GNU C fournit une API pour ajouter des spécificateurs personnalisés .
un exemple:
#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;
}
étant donné qu'il s'agit d'une extension glibc, le GCC met en garde contre ce spécificateur personnalisé:
$ 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]
sortie:
$ ./main The result is: false (written 21 characters) $ ./main 1 The result is: true (written 20 characters)
dans la tradition de itoa()
:
#define btoa(x) ((x)?"true":"false")
bool x = true;
printf("%s\n", btoa(x));
je préfère une réponse de la Meilleure façon d'imprimer le résultat d'un bool comme "faux" ou "vrai" en c? , comme
printf("%s\n", "false"151900920"true"+6*x);
- x == 0, "false\0true"+ 0", cela signifie "false";
- x == 1, "false\0true"+ 6", cela signifie "true";
si vous aimez C++ mieux que C, Vous pouvez essayer ceci:
#include <ios>
#include <iostream>
bool b = IsSomethingTrue();
std::cout << std::boolalpha << b;
pour juste imprimer 1 ou 0 basé sur la valeur booléenne que je viens d'utiliser:
printf("%d\n", !!(42));
particulièrement utile avec les drapeaux:
#define MY_FLAG (1 << 4)
int flags = MY_FLAG;
printf("%d\n", !!(flags & MY_FLAG));