591

由于 ANSI C99 存在_Boolbool通过stdbool.h. 但是是否还有printfbool 的格式说明符?

我的意思是在那个伪代码中:

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

这将打印:

true
4

8 回答 8

911

类型没有格式说明符bool。但是,由于任何小于在传递给可变参数时int提升为的整数类型,您可以使用:intprintf()%d

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

但为什么不:

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

或更好:

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

或者,甚至更好:

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

反而?

于 2013-06-25T20:52:10.597 回答
51

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

printf("%s", x?"true":"false");
于 2013-06-25T20:52:02.353 回答
37

ANSI C99/C11 不包含用于bool.

但是GNU C 库提供了一个用于添加自定义说明符的 API

一个例子:

#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:在函数'main'中:
main.c:34:3:警告:未知转换类型字符“B”,格式为 [-Wformat=]
   r = printf("结果是:%B\n", b);
   ^
main.c:34:3:警告:格式参数过多 [-Wformat-extra-args]

输出:

$ ./main
结果是:假
(写 21 个字符)
$ ./main 1
结果是:真
(写20个字)
于 2014-03-01T12:30:30.280 回答
13

在传统中itoa()

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

bool x = true;
printf("%s\n", btoa(x));
于 2013-06-25T21:00:48.410 回答
5

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

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

资源

于 2013-06-25T20:52:53.297 回答
3

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

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

对标志特别有用:

#define MY_FLAG (1 << 4)
int flags = MY_FLAG;
printf("%d\n", !!(flags & MY_FLAG));
于 2016-12-09T13:26:18.453 回答
2

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

#include <ios>
#include <iostream>

bool b = IsSomethingTrue();
std::cout << std::boolalpha << b;
于 2016-01-19T19:48:49.610 回答
0

我更喜欢Best way to print the result as 'false' or 'true' in c? , 就像

printf("%s\n", "false\0true"+6*x);
  • x == 0, "false\0true"+ 0" 表示“假”;
  • x == 1, "false\0true"+ 6" 表示“真”;
于 2015-01-09T10:56:10.227 回答