bool的printf格式说明符是什么?

时间:2013-06-25 20:50:17

标签: c printf

自ANSI C99起,_Boolbool通过stdbool.h。但是bool还有一个printf格式说明符吗?

我的意思是伪代码:

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

会打印:

true

8 个答案:

答案 0 :(得分:581)

没有。但是,由于任何短于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);

代替?

答案 1 :(得分:37)

bool没有格式说明符。您可以使用一些现有的说明符打印它来打印整数类型或做一些更有趣的事情:

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

答案 2 :(得分:27)

ANSI C99 / C11不包含bool的额外printf转换说明符。

但是GNU C library provides an API for adding custom specifiers

一个例子:

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

由于它是一个glibc扩展,GCC警告该自定义说明符:

$ 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]

输出:

$ ./main
The result is: false
(written 21 characters)
$ ./main 1
The result is: true
(written 20 characters)

答案 3 :(得分:12)

itoa()的传统:

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

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

答案 4 :(得分:3)

你不能,但你可以打印0或1

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

source

答案 5 :(得分:1)

我更喜欢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)

根据刚刚使用的布尔值打印1或0:

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

对Flags特别有用:

#define MY_FLAG (1 << 4)
int flags = MY_FLAG;
printf("%d\n", !!(flags & MY_FLAG));

答案 7 :(得分:0)

如果你比C更喜欢C ++,你可以试试这个:

#include <ios>
#include <iostream>

bool b = IsSomethingTrue();
std::cout << std::boolalpha << b;