#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)
8条答案
按热度按时间t2a7ltrp1#
bool
类型没有格式说明符。但是,由于任何长度小于int
的整型类型在传递给printf()
的可变参数时都会升级为int
,因此可以使用%d
:但为什么不呢:
而不是
l7mqbcuq2#
bool
没有格式说明符,你可以使用一些现有的打印整型类型的说明符来打印它,或者做一些更花哨的事情:vm0i2vca3#
ANSI C99/C11不包括
bool
的额外printf转换说明符。但是GNU C library provides an API for adding custom specifiers。
举个例子:
因为它是glibc扩展,所以GCC会对自定义说明符发出警告:
输出:
o2g1uqev4#
在
itoa()
的传统中:uttx8gqw5#
不能打印,但可以打印0或1
source
rmbxnbpk6#
如果你喜欢C++胜过C,你可以试试这个:
jmo0nnb37#
根据我刚才使用的布尔值打印1或0:
特别适用于标志:
6rqinv9w8#
我更喜欢Best way to print the result of a bool as 'false' or 'true' in c?的答案,就像