Deoarece ANSI C99 există _Bool " sau "bool" prin " stdbool.h
. Dar există, de asemenea, un "printf" specificator de format pentru bool?
Adică ceva de genul în care pseudo-cod:
bool x = true;
printf("%B\n", x);
care s-ar imprima:
true
Nu e't. Dar din moment ce orice tip integral mai scurt decât int
este promovat la int
atunci când a trecut în jos pentru a printf()
s variadic argumente, puteți utiliza %d
:
bool x = true;
printf("%d\n", x); // prints 1
Dar de ce nu
printf(x ? "true" : "false");
sau mai bine
printf("%s", x ? "true" : "false");
sau chiar mai bine
fputs(x ? "true" : "false", stdout);
în schimb?
Nu există nici un specificator de format pentru bool. Puteți imprima folosind unele dintre cele existente proiectanti pentru imprimare integrantă tipuri sau de a face ceva mai de lux:
printf("%s", x?"true":"false");
ANSI C99/C11 don't includ un plus printf specificator de conversie pentru bool`.
Dar GNU C library oferă un API pentru a adăuga personalizat specificatori.
Un exemplu:
#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;
}
Deoarece este o glibc extensii CCG avertizează despre acest obicei specificator:
$ gcc-Wall-g principal.c -o main principal.c: În funcția de "principal": principal.c:34:3: avertisment: necunoscut conversie de tip caracter " B " în format [-Wformat=] r = printf("rezultatul este: %B\n", b); ^ principal.c:34:3: avertisment: prea multe argumente pentru format [-Wformat-extra-args]
Ieșire:
$ ./principalele Rezultatul este: fals (scris 21 de caractere) $ ./principala 1 Rezultatul este: adevărat (scris 20 de caractere)
Prefer un raspuns de la https://stackoverflow.com/questions/7617479/best-way-to-print-the-result-of-a-bool-as-false-or-true-in-c, la fel ca
printf("%s\n", "false\0true"+6*x);