Frage

Vielleicht ist das 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.:) :)

War es hilfreich?

Lösung

Wie wäre es mit der Verwendung der C++-Sprache selbst?

bool t = true;
bool f = false;
std::cout << std::noboolalpha << t << " == " << std::boolalpha << t << std::endl;        
std::cout << std::noboolalpha << f << " == " << std::boolalpha << f << std::endl;

AKTUALISIEREN:

Wenn Sie mehr als 4 Zeilen Code ohne Konsolenausgabe wünschen, gehen Sie bitte zu Auf der Seite von cppreference.com wird darüber gesprochen std::boolalpha Und std::noboolalpha Dies zeigt Ihnen die Konsolenausgabe und erklärt mehr über die API.

Zusätzlich verwenden std::boolalpha ändert den globalen Status von std::cout, möchten Sie möglicherweise das ursprüngliche Verhalten wiederherstellen Weitere Informationen zum Wiederherstellen des Status finden Sie hier std::cout.

Andere Tipps

Wir reden doch über C++, oder?Warum zum Teufel verwenden wir immer noch Makros?

C++-Inline-Funktionen bieten Ihnen die gleiche Geschwindigkeit wie ein Makro, mit dem zusätzlichen Vorteil der Typsicherheit und Parameterauswertung (wodurch das von Rodney und dwj erwähnte Problem vermieden wird).

inline const char * const BoolToString(bool b)
{
  return b ? "true" : "false";
}

Abgesehen davon habe ich noch ein paar andere Kritikpunkte, insbesondere an der akzeptierten Antwort :)

// this is used in C, not C++. if you want to use printf, instead include <cstdio>
//#include <stdio.h>
// instead you should use the iostream libs
#include <iostream>

// not only is this a C include, it's totally unnecessary!
//#include <stdarg.h>

// Macros - not type-safe, has side-effects. Use inline functions instead
//#define BOOL_STR(b) (b?"true":"false")
inline const char * const BoolToString(bool b)
{
  return b ? "true" : "false";
}

int main (int argc, char const *argv[]) {
    bool alpha = true;

    // printf? that's C, not C++
    //printf( BOOL_STR(alpha) );
    // use the iostream functionality
    std::cout << BoolToString(alpha);
    return 0;
}

Prost :)


@DrPizza:Für eine so einfache Funktion eine ganze Boost-Bibliothek einbinden?Du willst mich doch veräppeln?

C++ verfügt über geeignete Zeichenfolgen, sodass Sie diese genauso gut 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 umständliche manuelle Speicherverwaltung mehr;richtig gezählte Strings mit richtiger Wertesemantik.

C++ bietet auch die Möglichkeit, Bool-Werte in für Menschen lesbare Darstellungen umzuwandeln.Hinweise darauf haben wir bereits früher in den iostream-Beispielen gesehen, diese sind jedoch etwas eingeschränkt, da sie den Text nur an die Konsole (oder mit fstreams, eine Datei) senden können.Glücklicherweise waren die Designer von C++ keine völligen Idioten;Wir haben auch iostreams, die nicht von der Konsole oder einer Datei, sondern von einem automatisch verwalteten String-Puffer unterstützt werden.Sie werden Stringstreams genannt.#include <sstream>, um sie zu erhalten.Dann können wir sagen:

std::string bool_as_text(bool b)
{
    std::stringstream converter;
    converter << std::boolalpha << b;   // flag boolalpha calls converter.setf(std::ios_base::boolalpha)
    return converter.str();
}

Natürlich wollen wir das alles nicht wirklich abtippen.Glücklicherweise verfügt C++ auch über eine praktische Bibliothek eines Drittanbieters namens Schub das kann uns hier weiterhelfen.Boost hat eine nette Funktion namens lexical_cast.Wir können es so verwenden:

boost::lexical_cast<std::string>(my_bool)

Nun kann man mit Fug und Recht behaupten, dass dies einen höheren Overhead als einige Makros darstellt;Stringstreams befassen sich mit Gebietsschemata, 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.Andererseits kann die Stringstream-Methode für zahlreiche 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 eigentlich jedem Typ mit den richtig formatierten E/A-Operatoren verwenden.Sie sind also sehr vielseitig und nützlich.

Und wenn Ihre Profilerstellung und Ihr Benchmarking nach all dem ergeben, dass die lexical_casts einen inakzeptablen Engpass darstellen, das ist wann Sie darüber nachdenken sollten, etwas Makro-Horror zu machen.

Das sollte in Ordnung sein:


const char* bool_cast(const bool b) {
    return b ? "true" : "false";
}

Aber wenn Sie es eher C++-mäßig machen möchten:


#include <iostream>
#include <string>
#include <sstream>
using namespace std;

string bool_cast(const bool b) {
    ostringstream ss;
    ss << boolalpha << b;
    return ss.str();
}

int main() {
    cout << bool_cast(true) << "\n";
    cout << bool_cast(false) << "\n";
}

Wenn Sie sich entscheiden, Makros zu verwenden (oder C in einem zukünftigen Projekt verwenden), sollten Sie in der Makroerweiterung Klammern um das „b“ einfügen (ich habe noch nicht genug Punkte, um den Inhalt anderer Leute zu bearbeiten):

#define BOOL_STR(b) ((b)?"true":"false")

Das ist ein defensive Programmierung Technik, die vor versteckten Fehlern bei der Reihenfolge der Operationen schützt;d.h. wie lässt sich das auswerten? alle Compiler?

1 == 2 ? "true" : "false"

im Vergleich zu

(1 == 2) ? "true" : "false"

Ich verwende ein Ternär in einem printf wie diesem:

printf("%s\n", b?"true":"false");

Wenn Sie es per Makro ausführen:

B2S(b) ((b)?"true":"false")

Dann müssen Sie sicherstellen, als was auch immer Sie übergeben 'b' hat keine Nebenwirkungen.Und vergessen Sie nicht die Klammern um die 'b' da es zu Kompilierungsfehlern kommen könnte.

Mit C++11 können Sie ein Lambda verwenden, um einen etwas kompakteren Code und eine direktere Verwendung zu erhalten:

bool to_convert{true};
auto bool_to_string = [](bool b) -> std::string {
    return b ? "true" : "false";
};
std::string str{"string to print -> "};
std::cout<<str+bool_to_string(to_convert);

Drucke:

string to print -> true

Dieser Beitrag ist alt, aber jetzt können Sie ihn verwenden std::to_string viele Variablen konvertieren als std::string.

http://en.cppreference.com/w/cpp/string/basic_string/to_string

Verwenden boolalpha bool in einen String drucken.

std::cout << std::boolalpha << b << endl;
std::cout << std::noboolalpha << b << endl;

C++-Referenz

Ich stimme zu, dass ein Makro möglicherweise am besten passt.Ich habe gerade einen Testfall erstellt (glauben Sie mir, ich bin nicht gut in C/C++, aber das klang lustig):

#include <stdio.h>
#include <stdarg.h>

#define BOOL_STR(b) (b?"true":"false")

int main (int argc, char const *argv[]) {
    bool alpha = true;
    printf( BOOL_STR(alpha) );
    return 0;
}

Solange Strings direkt als char-Array betrachtet werden können, wird es wirklich schwierig sein, mich davon zu überzeugen std::string stellt Strings als Bürger erster Klasse in C++ dar.

Außerdem scheint mir die Kombination von Allokation und Begrenztheit sowieso eine schlechte Idee zu sein.

Probieren Sie dieses Makro aus.Überall dort, wo „wahr“ oder „falsch“ angezeigt werden soll, ersetzen Sie es einfach durch PRINTBOOL(var), wobei var der Bool-Wert ist, für den Sie den Text haben möchten.

#define PRINTBOOL(x) x?"true":"false"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top