719 Stimmen

Was ist der printf-Formatplatzhalter für bool?

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

1110voto

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?

75voto

Ivaylo Strandjev Punkte 67241

Es gibt keinen Formatierungsanweisung für bool. Sie können es mit einigen der vorhandenen Anweisungen zum Drucken von ganzen Zahlen drucken oder etwas ausgefalleneres tun:

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

42voto

maxschlepzig Punkte 31061

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)

17voto

jxh Punkte 66464

In der Tradition von itoa():

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

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

5voto

Stephan Punkte 15132

Du kannst nicht, aber du kannst 0 oder 1 ausdrucken

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

Quelle

CodeJaeger.com

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.

Powered by:

X