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
307
demandé sur maxschlepzig 2013-06-26 00:50:17

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?

503
répondu 2013-06-25 21:04:39

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");
32
répondu Ivaylo Strandjev 2013-06-25 20:59:14

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)
25
répondu maxschlepzig 2014-03-01 12:30:30

dans la tradition de itoa() :

#define btoa(x) ((x)?"true":"false")

bool x = true;
printf("%s\n", btoa(x));
11
répondu jxh 2013-06-25 21:00:48

vous ne pouvez pas, mais vous pouvez imprimer 0 ou 1

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

source

3
répondu Stephan 2017-05-23 12:18:16

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";
2
répondu xjzhou 2017-05-23 11:54:50

si vous aimez C++ mieux que C, Vous pouvez essayer ceci:

#include <ios>
#include <iostream>

bool b = IsSomethingTrue();
std::cout << std::boolalpha << b;
0
répondu Arsen Y.M. 2016-01-19 19:48:49

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));
0
répondu Tarion 2016-12-09 13:26:18