Преобразование bool в текст в C ++ - PullRequest
79 голосов
/ 27 августа 2008

Может быть, это глупый вопрос, но есть ли способ преобразовать логическое значение в строку, так что 1 превращается в «true», а 0 в «false»? Я мог бы просто использовать оператор if, но было бы неплохо узнать, есть ли способ сделать это с помощью языка или стандартных библиотек. Плюс я педант. :)

Ответы [ 12 ]

109 голосов
/ 27 августа 2008

Как насчет использования самого языка C ++?

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;

ОБНОВЛЕНИЕ:

Если вам нужно больше 4 строк кода без вывода на консоль, перейдите на страницу cppreference.com, где рассказывается о std::boolalpha и std::noboolalpha, где показан вывод на консоль и более подробно рассказывается API.

Кроме того, использование std::boolalpha изменит глобальное состояние std::cout, вы можете восстановить исходное поведение , перейдите сюда для получения дополнительной информации о восстановлении состояния std::cout.

67 голосов
/ 27 августа 2008

Мы говорим о C ++, верно? С какой стати мы все еще используем макросы!?

Встроенные функции C ++ обеспечивают ту же скорость, что и макрос, с дополнительным преимуществом безопасности типов и оценки параметров (что позволяет избежать проблемы, о которой упоминали Родни и dwj.

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

Кроме этого у меня есть несколько других проблем, особенно с принятым ответом:)

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

Приветствия:)


@ DrPizza: Включите целую библиотеку надстроек ради функции, это так просто? Ты что, шутишь?

20 голосов
/ 27 августа 2008

C ++ имеет правильные строки, так что вы можете использовать их. Они в стандартной строке заголовка. #include чтобы использовать их. Больше нет переполнений буфера strcat / strcpy; больше нет пропущенных нулевых терминаторов; нет больше грязного ручного управления памятью; строки с правильным подсчетом и семантикой правильного значения.

C ++ имеет возможность конвертировать bools в удобочитаемые представления. Мы видели намеки на это ранее с примерами iostream, но они немного ограничены, потому что они могут только переносить текст на консоль (или с помощью fstreams, файла). К счастью, разработчики C ++ не были полными идиотами; у нас также есть iostreams, которые поддерживаются не консолью или файлом, а автоматически управляемым строковым буфером. Их называют струнными потоками. #include чтобы получить их. Тогда мы можем сказать:

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

Конечно, мы не хотим печатать все это. К счастью, в C ++ также есть удобная сторонняя библиотека с именем Boost , которая может помочь нам в этом. Boost имеет замечательную функцию lexical_cast. Мы можем использовать его таким образом:

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

Теперь верно сказать, что это больше издержек, чем какой-то макрос; Строковые потоки имеют дело с локалями, которые могут вас не волновать, и создают динамическую строку (с выделением памяти), тогда как макрос может выдавать буквальную строку, что позволяет избежать этого. Но, с другой стороны, метод stringstream может использоваться для очень многих преобразований между печатными и внутренними представлениями. Вы можете запустить их в обратном направлении; Например, boost :: lexical_cast ("true") делает правильные вещи. Вы можете использовать их с числами и фактически любым типом с правильными отформатированными операторами ввода-вывода. Так что они довольно универсальны и полезны.

И если после всего этого ваши профилирование и бенчмаркинг обнаружат, что lexical_casts являются недопустимым узким местом, это , когда вам следует подумать о том, чтобы сделать какой-нибудь макро-ужас.

6 голосов
/ 27 августа 2008

Это должно быть хорошо:


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

Но, если вы хотите сделать больше C ++ - ish:


#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";
}
4 голосов
/ 27 августа 2008

Если вы решили использовать макросы (или используете C в будущем проекте), вы должны добавить круглые скобки вокруг «b» в расширении макроса (у меня пока недостаточно точек для редактирования контента других людей):

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

Это метод защитного программирования , который защищает от скрытых ошибок порядка операций; то есть как это оценивается для всех компиляторов?

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

по сравнению с

(1 == 2) ? "true" : "false"
1 голос
/ 13 декабря 2018

С C ++ 11 вы можете использовать лямбду, чтобы получить немного более компактный код и использовать его на месте:

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

Печать:

string to print -> true
1 голос
/ 27 августа 2008

Я использую троичную в принтф, как это:

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

Если вы макрос это:

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

тогда вам нужно убедиться, что все, что вы указываете как 'b', не имеет побочных эффектов. И не забывайте скобки вокруг 'b', так как вы можете получить ошибки компиляции.

0 голосов
/ 22 мая 2018

Используйте boolalpha для печати bool to string.

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

C ++ Ссылка

0 голосов
/ 28 февраля 2018

Эта запись старая, но теперь вы можете использовать std::to_string для преобразования большого количества переменных в std::string.

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

0 голосов
/ 27 августа 2008

Поскольку строки можно просматривать непосредственно как массив символов, будет очень сложно убедить меня в том, что std::string представляет строки как граждан первого класса в C ++.

Кроме того, сочетание распределения и ограниченности кажется мне плохой идеей.

...