Что такое спецификатор формата printf для bool?

Начиная с ANSI C99 есть _Bool или bool через stdbool.h. Но есть ли также спецификатор формата printf для bool?

Я имею в виду что-то вроде этого псевдокода:

bool x = true;
printf("%B\n", x);

который будет печатать:

true
Комментарии к вопросу (5)
Решение

Там нет. Но поскольку любой интегральный тип, более короткий, чем int, повышается до int при передаче к вариационным аргументам printf (), вы можете использовать % d:

bool x = true;
printf("%d\n", x); // prints 1

Но почему бы нет

printf(x ? "true" : "false");

или лучше

printf("%s", x ? "true" : "false");

или даже лучше

fputs(x ? "true" : "false", stdout);

вместо?

Комментарии (12)

Для була нет спецификатора формата. Вы можете распечатать его, используя некоторые из существующих спецификаторов для печати интегральных типов, или сделать что-то более причудливое:

 printf("%s", x?"true":"false");
Комментарии (3)

ANSI C99 / C11 не включает дополнительный спецификатор преобразования printf для bool.

Но библиотека GNU C предоставляет API для добавления пользовательских спецификаторов.

Пример:

#include 
#include 
#include 

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;
}

Поскольку это расширения glibc, GCC предупреждает об этом пользовательском спецификаторе:

& Лт; pre > $ gcc -Wall -g main.c -o main main.c: в функции «main»: main.c:34:3: предупреждение: неизвестный символ типа преобразования «B» в формате [-Wformat =] r = printf («Результат:% B \ n», b) ; ^ main.c: 34: 3: предупреждение: слишком много аргументов для формата [-Wformat-extra-args] & Лт; / pre >

Вывод:

& Лт; pre > $ ./ основной Результат: ложный (написано 21 символ) $ ./ основной 1 Результат: правда (написано 20 символов) & Лт; / pre >

Комментарии (0)

В традиции itoa ():

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

bool x = true;
printf("%s\n", btoa(x));
Комментарии (11)

Вы не можете, но вы можете напечатать 0 или 1

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

источник

Комментарии (0)

Я предпочитаю ответ от https://stackoverflow.com/questions/7617479/best-way-to-print-the-result-of-a-bool-as-false-or-true-in-c, просто как

printf("%s\n", "false\0true"+6*x);
  • x == 0, «false \ 0true» + 0 »означает« false »;
  • x == 1, «false \ 0true» + 6 »означает« true »;
Комментарии (6)

Чтобы просто напечатать 1 или 0 на основе логического значения, которое я только что использовал:

printf("%d\n", !!(42));

Особенно полезно с флагами


#define MY_FLAG (1 
Комментарии (1)

Если вам нравится C ++ лучше, чем C, вы можете попробовать это:


#include 
#include 

bool b = IsSomethingTrue();
std::cout 
Комментарии (5)