Vielleicht ist dies eine dumme Frage, aber gibt es eine Möglichkeit, einen booleschen Wert in eine Zeichenfolge umzuwandeln, sodass 1 zu "wahr" und 0 zu "falsch" wird? Ich könnte einfach eine if-Anweisung verwenden, aber es wäre schön zu wissen, ob es eine Möglichkeit gibt, dies mit der Sprache oder den Standardbibliotheken zu tun. Außerdem bin ich ein Pedant. :) :)
93
Antworten:
Wie wäre es mit der C ++ - Sprache selbst?
AKTUALISIEREN:
Wenn Sie mehr als 4 Codezeilen ohne Konsolenausgabe wünschen, besuchen Sie bitte die Seite von cppreference.com, auf der über
std::boolalpha
und gesprochen wirdstd::noboolalpha
das zeigt die Konsole ausgegeben und erklärt mehr über die API.Wenn Sie zusätzlich
std::boolalpha
den globalen Status von ändernstd::cout
, möchten Sie möglicherweise das ursprüngliche Verhalten wiederherstellen. Weitere Informationen zum Wiederherstellen des Status von finden Sie hierstd::cout
.quelle
std::string str
und speichern Sie das Ergebnis der Konvertierung, wenn Sie können.Wir sprechen über C ++, oder? Warum um alles in der Welt verwenden wir immer noch Makros?
C ++ - Inline-Funktionen bieten die gleiche Geschwindigkeit wie ein Makro, mit dem zusätzlichen Vorteil der Typensicherheit und der Parameterbewertung (wodurch das von Rodney und dwj erwähnte Problem vermieden wird.
Abgesehen davon habe ich ein paar andere Probleme, besonders mit der akzeptierten Antwort :)
Prost :)
@ DrPizza: Fügen Sie eine ganze Boost-Bibliothek für eine so einfache Funktion ein? Du willst mich doch veräppeln?
quelle
string
wenn Zeichenfolgenkonstanten für "true" und "false" in statischen const-Variablen gespeichert sind.cout << (bool_x ? "true": "false") << endl;
C ++ verfügt über geeignete Zeichenfolgen, sodass Sie diese auch verwenden können. Sie befinden sich in der Standard-Header-Zeichenfolge. #include <string>, um sie zu verwenden. Keine strcat / strcpy-Pufferüberläufe mehr; keine fehlenden Nullterminatoren mehr; keine unordentliche manuelle Speicherverwaltung mehr; richtig gezählte Zeichenfolgen mit korrekter Wertesemantik.
C ++ kann Bools auch in lesbare Darstellungen konvertieren. Wir haben früher bei den iostream-Beispielen Hinweise darauf gesehen, aber sie sind etwas eingeschränkt, da sie nur den Text auf die Konsole (oder mit fstreams, einer Datei) übertragen können. Glücklicherweise waren die Designer von C ++ keine vollständigen Idioten. Wir haben auch iostreams, die nicht von der Konsole oder einer Datei, sondern von einem automatisch verwalteten Zeichenfolgenpuffer unterstützt werden. Sie werden Stringstreams genannt. #include <sstream>, um sie zu erhalten. Dann können wir sagen:
Natürlich wollen wir das alles nicht wirklich tippen. Glücklicherweise verfügt C ++ auch über eine praktische Drittanbieter-Bibliothek namens Boost , die uns hier weiterhelfen kann. Boost hat eine nette Funktion namens lexical_cast. Wir können es so verwenden:
Nun ist es wahr zu sagen, dass dies ein höherer Overhead ist als irgendein Makro; Stringstreams behandeln Gebietsschemas, die Sie möglicherweise nicht interessieren, und erstellen eine dynamische Zeichenfolge (mit Speicherzuweisung), während das Makro eine Literalzeichenfolge liefern kann, wodurch dies vermieden wird. Auf der anderen Seite kann die Stringstream-Methode jedoch für sehr viele Konvertierungen zwischen druckbaren und internen Darstellungen verwendet werden. Sie können sie rückwärts laufen lassen; boost :: lexical_cast <bool> ("true") macht zum Beispiel das Richtige. Sie können sie mit Zahlen und tatsächlich jedem Typ mit den richtig formatierten E / A-Operatoren verwenden. Sie sind also sehr vielseitig und nützlich.
Und wenn nach all dem Ihre Profilerstellung und Ihr Benchmarking ergeben, dass die lexical_casts ein inakzeptabler Engpass sind , sollten Sie in Betracht ziehen, einen Makro-Horror zu machen.
quelle
Das sollte in Ordnung sein:
Aber wenn Sie es mehr C ++ - ish machen wollen:
quelle
Wenn Sie sich für die Verwendung von Makros entscheiden (oder C für ein zukünftiges Projekt verwenden), sollten Sie in der Makroerweiterung Klammern um das 'b' einfügen (ich habe noch nicht genügend Punkte, um den Inhalt anderer Personen zu bearbeiten):
Dies ist eine defensive Programmiertechnik , die vor versteckten Fehlern in der Reihenfolge der Operationen schützt. dh wie bewertet dies für alle Compiler?
verglichen mit
quelle
Ich benutze ein ternäres in einem printf wie diesem:
Wenn Sie es makro:
Dann müssen Sie sicherstellen, dass alles, was Sie weitergeben
'b'
, keine Nebenwirkungen hat. Und vergessen Sie nicht die Klammern um,'b'
da sonst Kompilierungsfehler auftreten können.quelle
Mit C ++ 11 können Sie ein Lambda verwenden, um einen etwas kompakteren Code zu erhalten und diese direkt zu verwenden:
Drucke:
quelle
Dieser Beitrag ist alt, aber jetzt können Sie
std::to_string
viele Variablen als konvertierenstd::string
.http://en.cppreference.com/w/cpp/string/basic_string/to_string
quelle
Ohne den Strom hineinzuziehen:
quelle
Verwenden Sie
boolalpha
diese Option, um bool to string zu drucken.C ++ - Referenz
quelle
Ich bin damit einverstanden, dass ein Makro am besten passt. Ich habe gerade einen Testfall erstellt (glauben Sie mir, ich bin nicht gut mit C / C ++, aber das klang lustig):
quelle
Solange Strings direkt als Char-Array angesehen werden können, wird es sehr schwer sein, mich davon zu überzeugen
std::string
Strings als erstklassige Bürger in C ++ dargestellt werden.Außerdem scheint es mir sowieso eine schlechte Idee zu sein, Allokation und Begrenztheit zu kombinieren.
quelle
Probieren Sie dieses Makro aus. Überall dort, wo "true" oder "false" angezeigt werden soll, ersetzen Sie es einfach durch PRINTBOOL (var), wobei var der Bool ist, für den Sie den Text möchten.
quelle