Seit ANSI C99 gibt es _Bool
oder bool
via stdbool.h
. Aber gibt es auch einen printf
Formatbezeichner für bool?
Ich meine so etwas wie in diesem Pseudocode:
bool x = true;
printf("%B\n", x);
was drucken würde:
true
Seit ANSI C99 gibt es _Bool
oder bool
via stdbool.h
. Aber gibt es auch einen printf
Formatbezeichner für bool?
Ich meine so etwas wie in diesem Pseudocode:
bool x = true;
printf("%B\n", x);
was drucken würde:
true
Antworten:
Es gibt keinen Formatbezeichner für bool
Typen. Da jedoch jeder Integraltyp, der kürzer int
ist int
als bei printf()
der Übergabe an die variadischen Argumente heraufgestuft, verwendet wird, können Sie Folgendes verwenden %d
:
bool x = true;
printf("%d\n", x); // prints 1
Aber warum nicht:
printf(x ? "true" : "false");
oder besser:
printf("%s", x ? "true" : "false");
oder noch besser:
fputs(x ? "true" : "false", stdout);
stattdessen?
printf("%s", x ? "true" : "false");
würde das Problem beheben.
printf("%s", x ? "true" : "false");
ist besser , dass printf(x ? "true" : "false");
- Sie sind insgesamt die Kontrolle über das Format - String hier so gibt es keine Gefahr , dass sie etwas bekommen wie "%d"
die Probleme verursachen würde. Die fputs
, auf der anderen Seite, ist eine bessere Option.
fputs
"noch besser"? Ich bin immer auf der Suche nach Möglichkeiten, mein C zu verbessern. Unter welchen Umständen sollte ich fputs
statt verwenden printf
?
Es gibt keinen Formatbezeichner für bool. Sie können es mit einigen der vorhandenen Spezifizierer zum Drucken integraler Typen drucken oder etwas ausgefalleneres tun:
printf("%s", x?"true":"false");
bool
Typ in C, nur nicht in der C89-Edition - er ist Teil der C99-Sprachspezifikation. Es gibt ein neues Schlüsselwort _Bool
, und wenn Sie es einschließen <stdbool.h>
, bool
ist es ein Synonym für _Bool
.
ANSI C99 / C11 enthält keinen zusätzlichen printf-Konvertierungsspezifizierer für bool
.
Die GNU C-Bibliothek bietet jedoch eine API zum Hinzufügen benutzerdefinierter Spezifizierer .
Ein Beispiel:
#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;
}
Da es sich um eine glibc-Erweiterung handelt, warnt der GCC vor diesem benutzerdefinierten Bezeichner:
$ gcc -Wall -g main.c -o main main.c: In der Funktion 'main': main.c: 34: 3: Warnung: Unbekanntes Konvertierungstypzeichen 'B' im Format [-Wformat =] r = printf ("Das Ergebnis ist:% B \ n", b); ^ main.c: 34: 3: Warnung: Zu viele Argumente für das Format [-Wformat-extra-args]
Ausgabe:
$ ./main Das Ergebnis ist: false (21 Zeichen geschrieben) $ ./main 1 Das Ergebnis ist: wahr (geschrieben 20 Zeichen)
In der Tradition von itoa()
:
#define btoa(x) ((x)?"true":"false")
bool x = true;
printf("%s\n", btoa(x));
btoa
ist "Binärzeichenfolge zur Basis 64 Zeichenfolge" in nicht standardmäßigem JavaScript (Gecko und WebKit), daher möchten Sie möglicherweise einen anderen Namen verwenden.
"true\0false"[(!x)*5]
!!x*5
.
Wenn Sie C ++ besser mögen als C, können Sie dies versuchen:
#include <ios>
#include <iostream>
bool b = IsSomethingTrue();
std::cout << std::boolalpha << b;
Ich bevorzuge eine Antwort von Bester Weg, um das Ergebnis eines Bools als 'falsch' oder 'wahr' in c zu drucken. , so wie
printf("%s\n", "false\0true"+6*x);
"false\0true"+6*x
wirklich geschah. Wenn Sie in einem Projekt mit anderen Personen arbeiten oder nur in einem Projekt mit einer Codebasis, die Sie x Jahre später verstehen möchten , sollten Konstruktionen wie diese vermieden werden.
printf("%s\n","false\0true"+6*(x?1:0));
was nur ... 5% weniger lesbar ist.
static inline char const *bool2str(_Bool b) { return "false\0true"+6*x; } int main(void) { printf("%s != %s", bool2str(false), bool2str(true)); return 0; }
Gleich wie mit static inline char decimal2char(int d) { assert(d >= 0 && d <= 9); return '0' + d; }
; Wickeln Sie es einfach in eine beschreibende benannte Funktion und sorgen Sie sich nicht um die Lesbarkeit.