Seit ANSI C99 gibt es _Bool
oder bool
über stdbool.h
. Aber gibt es auch einen printf
-Formatanweiser für bool?
Ich meine so etwas wie in diesem Pseudocode:
bool x = true;
printf("%B\n", x);
was folgendes ausgeben würde:
true
Seit ANSI C99 gibt es _Bool
oder bool
über stdbool.h
. Aber gibt es auch einen printf
-Formatanweiser für bool?
Ich meine so etwas wie in diesem Pseudocode:
bool x = true;
printf("%B\n", x);
was folgendes ausgeben würde:
true
Es gibt keinen Formatierungsplatzhalter für bool
Typen. Da jedoch jeder ganze Datentyp kürzer als int
auf int
hochgestuft wird, wenn er an die variadischen Argumente von printf()
übergeben wird, können Sie %d
verwenden:
bool x = true;
printf("%d\n", x); // gibt 1 aus
Aber warum nicht:
printf("Ihre boolesche Variable ist: %s", x ? "true" : "false");
stattdessen?
ANSI C99/C11 enthalten keinen zusätzlichen printf-Konvertierungsspezifiker für bool
.
Aber die GNU C-Bibliothek stellt eine API zum Hinzufügen benutzerdefinierter Spezifizierer bereit.
Ein Beispiel:
#include
#include
#include
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("Das Ergebnis lautet: %B\n", b);
printf("(geschriebene %d Zeichen)\n", r);
return 0;
}
Weil es sich um eine glibc-Erweiterung handelt, warnt der GCC vor diesem benutzerdefinierten Spezifizierer:
$ gcc -Wall -g main.c -o main
main.c: In Funktion 'main':
main.c:34:3: Warnung: Unbekannter Konvertierungstyp 'B' im Format \[-Wformat=\]
r = printf("Das Ergebnis lautet: %B\\n", b);
^
main.c:34:3: Warnung: Zu viele Argumente für das Format \[-Wformat-extra-args\]
Ausgabe:
$ ./main
Das Ergebnis lautet: false
(geschriebene 21 Zeichen)
$ ./main 1
Das Ergebnis lautet: true
(geschriebene 20 Zeichen)
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.