Konwersja bool do tekstu w języku C ++

głosy
67

Może to głupie pytanie, ale czy jest jakiś sposób przekonwertować wartość logiczną na ciąg taki, że 1 zamienia się w „prawdziwe” i 0 zamienia na „false”? Mogłem po prostu użyć instrukcji if, ale byłoby miło wiedzieć, czy istnieje sposób, aby to zrobić z językiem lub standardowych bibliotek. Plus, jestem pedantem. :)

Utwórz 27/08/2008 o 03:32
źródło użytkownik
W innych językach...                            


13 odpowiedzi

głosy
102

Jak o użyciu języka C ++ samego?

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;
Odpowiedział 27/08/2008 o 06:10
źródło użytkownik

głosy
61

Mówimy o C ++, prawda? Dlaczego na ziemi są nadal za pomocą makr !?

C ++ funkcje inline daje taką samą prędkość jak makra, z dodatkową korzyścią typu bezpieczeństwa i oceny parametrów (co pozwala uniknąć tego problemu, że Rodney i DWJ wspomniałem.

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

Poza tym mam kilka innych zastrzeżenie, zwłaszcza z przyjętą odpowiedzi :)

// 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;
}

Twoje zdrowie :)


@DrPizza: Dołącz cały doładowania lib dla dobra funkcja ta prosta? Chyba sobie żartujesz?

Odpowiedział 27/08/2008 o 10:34
źródło użytkownik

głosy
21

C ++ posiada odpowiednie sznurki więc równie dobrze można ich używać. Są w standardowym ciąg nagłówka. #include <string>, aby z nich korzystać. Nie więcej strcat / StrCpy przekroczenia buforowe; brakuje nie więcej pustych terminatorów; nie więcej niechlujny zarządzanie pamięcią obsługi; Prawidłowa liczone struny odpowiednich semantyki wartości.

C ++ posiada możliwość konwersji bools do reprezentacji w postaci czytelnej dla człowieka zbyt. Widzieliśmy wskazówek na to wcześniej z przykładów iostream, ale są nieco ograniczone, ponieważ mogą one jedynie wybuch tekst do konsoli (lub z fstreams, plik). Na szczęście projektanci C ++ nie były kompletne idiotów; mamy także iostreams które nie są wspierane przez konsolę lub pliku, ale bufor strun automatycznie zarządza. Są one nazywane stringstreams. #include <sstream>, aby je zdobyć. Wtedy możemy powiedzieć:

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();
}

Oczywiście, tak naprawdę nie chcesz wpisywać wszystko. Na szczęście, C ++ posiada również wygodny biblioteki innej firmy o nazwie Boost, które mogą nam pomóc tutaj. Rozbudowa ma ładny funkcję o nazwie lexical_cast. Możemy go używać w następujący sposób:

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

Teraz, to prawda powiedzieć, że to jest wyższa niż górny jakiegoś makro; stringstreams czynienia z lokalizacjach, które może nie dbają o, i stworzyć dynamiczny ciąg (z alokacji pamięci), natomiast makro mogą przynieść ciągiem znaków, który unika tego. Ale z drugiej strony, metoda stringstream może być stosowany do bardzo wielu konwersji między druku i wewnętrznych reprezentacji. Można uruchomić „em do tyłu; boost :: lexical_cast <bool> ( "true") czyni słusznie, na przykład. Można ich używać z numerami i faktycznie dowolnego typu z odpowiednimi sformatowana operatorów I / O. Więc są one dość wszechstronny i przydatny.

A jeśli mimo wszystko to profilowanie i analiza porównawcza wykazuje, że lexical_casts są niedopuszczalne gardłem, to kiedy należy rozważyć jakiejś makro horror.

Odpowiedział 27/08/2008 o 10:56
źródło użytkownik

głosy
6

To powinno być w porządku:


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

Ale, jeśli chcesz to zrobić więcej C ++ - owski:


#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";
}
Odpowiedział 27/08/2008 o 12:08
źródło użytkownik

głosy
4

Jeśli zdecydujesz się korzystać z makr (lub używasz C na przyszłego projektu) należy dodać nawias wokół „b” w ekspansji makra (nie mam jeszcze wystarczającej liczby punktów, aby edytować zawartość strony innych ludzi):

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

Jest to defensywny programowania techniką, która chroni przed ukrytymi order-of-operacjach błędów; czyli jak to ocenić dla wszystkich kompilatorów?

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

w porównaniu do

(1 == 2) ? "true" : "false"
Odpowiedział 27/08/2008 o 05:46
źródło użytkownik

głosy
1

Używam potrójny w printf tak:

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

Jeśli makro to:

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

to trzeba się upewnić, co przekazać w jak 'b'nie ma żadnych skutków ubocznych. I nie zapomnij nawiasy wokół 'b'jak można dostać kompilacji błędów.

Odpowiedział 27/08/2008 o 05:19
źródło użytkownik

głosy
0

Bez przeciągania ostream do niego:

constexpr char const* to_c_str(bool b) {
   return  
    std::array<char const*, 2>{"false", "true "}[b]
   ;
};
Odpowiedział 03/08/2019 o 13:35
źródło użytkownik

głosy
0

Z C ++ 11 można wykorzystywać lambda, aby uzyskać nieco bardziej zwarty kod i wykorzystania w lokalu:

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);

druki:

string to print -> true
Odpowiedział 13/12/2018 o 13:50
źródło użytkownik

głosy
0

Użyj boolalphado wydrukowania bool do łańcucha.

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

C ++ Reference

Odpowiedział 22/05/2018 o 12:52
źródło użytkownik

głosy
0

Ten post jest stary, ale teraz można używać std::to_stringdo konwersji wiele zmiennych, jak std::string.

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

Odpowiedział 28/02/2018 o 14:56
źródło użytkownik

głosy
-5

Dopóki łańcuchy mogą być oglądane bezpośrednio w tablicy char to będzie bardzo trudno przekonać mnie, że std::stringreprezentuje ciągi jako pierwsza obywateli klasy w C ++.

Poza tym, łącząc przydziału i ograniczoności wydaje się być zły pomysł, aby mnie tak czy inaczej.

Odpowiedział 27/08/2008 o 14:37
źródło użytkownik

głosy
-5

Zgadzam się, że makro może być najlepsze dopasowanie. Właśnie bita przypadek testowy (wierzcie mi, że nie jestem dobry z C / C ++, ale to brzmiało dobrze):

#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;
}
Odpowiedział 27/08/2008 o 03:41
źródło użytkownik

głosy
-7

Spróbuj tego makra. Gdziekolwiek chcesz „true” lub false, aby pokazać się po prostu zastąpić go PRINTBOOL (VAR), gdzie var jest bool chcesz tekst.

#define PRINTBOOL(x) x?"true":"false"
Odpowiedział 27/08/2008 o 03:42
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more