Drucken boolescher Werte in C++

Suraj P 12 Oktober 2023
  1. Boolescher Wert als True/False in C++
  2. Ändern Sie printf(), indem Sie eine ternäre Anweisung hinzufügen, um boolesche Werte in C++ zu drucken
  3. Verwendung von std::boolalpha in cout zum Drucken boolescher Werte in C++
  4. Verwenden Sie die benutzerdefinierte Facette für std::numpunc, um boolesche Werte in C++ zu drucken
  5. Fazit
Drucken boolescher Werte in C++

Wenn wir versuchen, boolesche Werte in C++ auszugeben, werden sie entweder als 0 oder 1 von std::cout ausgegeben, aber manchmal ist es besser, die Ausgabe in Form von true oder false zu sehen. Dieser Artikel befasst sich mit dem Drucken von booleschen Werten in Textform in C++.

Boolescher Wert als True/False in C++

Nehmen wir ein Szenario an, in dem wir beim Debuggen Codezeilen und Protokolldateien durchlesen, und jetzt ist es sehr einfach, eine 0 oder eine 1 in einem Meer von Fehlern und Zahlen zu übersehen. Es ist also besser, den Bool-Wert als true/false ausgeben zu lassen.

Wir werden drei verschiedene Wege sehen, um dies zu erreichen.

Ändern Sie printf(), indem Sie eine ternäre Anweisung hinzufügen, um boolesche Werte in C++ zu drucken

Der einfachste Weg ist, eine kleine Modifikation in printf() vorzunehmen, kann true oder false ausgeben. Beim Drucken von bool mit printf() müssen wir das Format %d verwenden, da es keinen spezifischen Parameter für bool-Werte gibt.

Da bool kürzer als int ist, wird es zu int hochgestuft, wenn es in der printf()-Anweisung übergeben wird. Aber dies gibt die einfachen alten 0 und 1 aus, also modifizieren wir, indem wir die ternäre if-Anweisung hinzufügen und den Formatbezeichner auf %s ändern, und wir erhalten unser gewünschtes true oder false die Ausgabe.

Beispielcode:

#include <iostream>
using namespace std;

int main() {
  printf("boolean true: %d\n", true);
  printf("boolean false: %d\n", false);

  // modified printf()
  printf("boolean true: %s\n", true ? "true" : "false");
  printf("boolean false: %s\n", false ? "true" : "false");
}

Ausgabe:

boolean true: 1
boolean false: 0
boolean true: true
boolean false: false

Das Problem bei dieser Methode besteht darin, dass die Lesbarkeit der Quellcodedateien beeinträchtigt wird, wenn sie groß und komplex werden.

Verwendung von std::boolalpha in cout zum Drucken boolescher Werte in C++

std::boolalpha ist in der Header-Datei <iomanip> zu finden und funktioniert mit den Input- und Output-Stream-Funktionen. Die Standard-Streams haben ein boolalpha-Flag, das bestimmt, was auf dem Bildschirm gedruckt wird.

Wenn es auf true gesetzt ist, zeigt es die Textform von booleschen Werten an, d. h. true oder false, aber wenn es auf false gesetzt ist, erhalten wir nur eine boolsche Ausgabe als 0 und 1.

Beispiel:

#include <iostream>
using namespace std;

int main() {
  cout << "when boolalpha flag is off\n";
  cout << "true: " << true << endl;
  cout << "false: " << false << endl;

  cout << "when boolalpha flag is on\n";
  cout << boolalpha << "true: " << true << endl;
  cout << boolalpha << "false: " << false << endl;
  cout << noboolalpha;
}

Ausgabe:

when boolalpha flag is off
true: 1
false: 0
when boolalpha flag is on
true: true
false: false

std::boolalpha ist eine der besten Möglichkeiten, true oder false als Ausgabe auszugeben, hat aber ein paar Nachteile. Zuerst sollten wir das boolalpha-Flag ausschalten, nachdem wir es über std::noboolalpha verwendet haben.

Ein weiteres Problem ist, was ist, wenn wir in Japanisch oder einer anderen Sprache codieren wollen und wir möchten, dass "hai" (wahr auf Japanisch) oder "nai" (falsch auf Japanisch) anstelle von true oder false gedruckt wird, oder wenn wir die Wörter als True oder False grossschreiben wollen, können wir keines davon mit std::boolalpha allein tun.

Verwenden Sie die benutzerdefinierte Facette für std::numpunc, um boolesche Werte in C++ zu drucken

Wie im vorherigen Absatz erwähnt, was ist, wenn wir etwas anderes als true oder false oder großgeschriebene oder lokalisierte Ausgabe drucken möchten. Dies kann mit einer benutzerdefinierten facet für std::numpunct erfolgen.

Eine facet ist eine Klasse, die den mit einem bestimmten kulturellen Aspekt verknüpften Gebietsschema-Funktionssatz beschreibt. Stream-Eingabe- und -Ausgabeoperationen verwenden std::numpunct bis std::numget und std::numput zum Analysieren der numerischen Eingabe und zum Formatieren der numerischen Ausgabe.

Die facet für std::numpunct kapselt die numerischen Interpunktionspräferenzen. Wir können unsere eigenen Strings angeben, die wir zurückgeben möchten, wenn das std::boolalpha-Flag aktiv ist, indem wir die in std::numpunct vorhandenen Funktionen do_truename() und do_falsename() überschreiben.

Danach können wir mit dem Objekt std::locale zusammen mit der Verwendung von std::cout.imbue() das aktuelle Gebietsschema ersetzen.

Beispielcode:

#include <ios>
#include <iostream>
#include <locale>
using namespace std;

class japanese_bool : public std::numpunct<char> {
 protected:
  std::string do_truename() const override { return "Hai"; }
  std::string do_falsename() const override { return "NAI"; }
};

int main() {
  cout.imbue(std::locale(std::locale(), new japanese_bool));
  cout << std::boolalpha;
  cout << "Japanese true : " << true << "\n";
  cout << "Japanese false : " << false << "\n";
  cout << noboolalpha;
}

Im obigen Code ist new kein Speicherleck, das japanese_bool-Objekt wird implizit als Referenz gezählt, und wenn die std::locale-Referenz den Gültigkeitsbereich verlässt, wird sie automatisch zerstört.

Ausgabe:

Japanese true : Hai
Japanese false : NAI

Fazit

Dieser Artikel hat uns verschiedene Methoden beigebracht, um die Bool-Ausgabe als true und false auszugeben. Die ersten beiden Methoden sind vorzuziehen, wenn wir true oder false als Ausgabe haben möchten, während die dritte Methode bevorzugt wird, wenn wir eine spezialisierte Ausgabe anstelle von nur true oder false wünschen.

Autor: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub