Преобразование bool в текст на C++
может быть, это глупый вопрос, но есть ли способ преобразовать логическое значение в строку таким образом, что 1 превращается в "true" и 0 превращается в "false"? Я мог бы просто использовать оператор if, но было бы неплохо узнать, есть ли способ сделать это с помощью языка или стандартных библиотек. Кроме того, я педант. :)
11 ответов:
как насчет использования самого языка 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 ' s страница говорит о
std::boolalpha
иstd::noboolalpha
который показывает вам вывод консоли и объясняет больше об API.дополнительно используя
std::boolalpha
изменить глобальное состояниеstd::cout
, вы можете восстановить исходное поведение перейти здесь для получения дополнительной информации о восстановление состоянияstd::cout
.
мы говорим о 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: включите весь импульс lib ради функции такой простой? Ты издеваешься?
C++ имеет правильные строки, так что вы могли бы также использовать их. Они находятся в стандартной строке заголовка. #include
, чтобы использовать их. Нет больше переполнений буфера strcat / strcpy; нет больше отсутствующих нулевых Терминаторов; нет больше беспорядочного ручного управления памятью; правильные подсчитанные строки с правильной семантикой значений. C++ также имеет возможность конвертировать bools в удобочитаемые представления. Мы видели намеки на это ранее с примерами iostream, но они немного ограничены, потому что они могут только blast текст на консоль (или с 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)
теперь верно сказать, что это выше накладных расходов, чем некоторые макросы; stringstreams имеют дело с локалями, которые вас могут не волновать, и создают динамическую строку (с выделением памяти), тогда как макрос может давать литеральную строку, что позволяет избежать этого. Но с другой стороны, метод stringstream может использоваться для очень многих преобразований между печатными и внутренними представлениями. Вы может запускать их назад; boost:: lexical_cast
("true") делает правильную вещь, например. Вы можете использовать их с числами и фактически любым типом с правильными форматированными операторами ввода-вывода. Так что они довольно универсальны и полезны. и если после всего этого ваше профилирование и бенчмаркинг показывают, что lexical_casts являются неприемлемым узким местом,это когда вы должны рассмотреть возможность сделать некоторые макро-ужас.
Это должно быть прекрасно:
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"; }
Если вы решили использовать макросы (или используете C в будущем проекте), вы должны добавить скобки вокруг "b" в расширении макроса (у меня еще нет достаточно точек для редактирования содержимого других людей):
#define BOOL_STR(b) ((b)?"true":"false")
Это защитное Программирование метод, который защищает от скрытых ошибок порядка операций; т. е., как это оценивается для все компиляторы?
1 == 2 ? "true" : "false"
по сравнению с
(1 == 2) ? "true" : "false"
Я использую троичный в printf, как это:
printf("%s\n", b?"true":"false");
если вы макрос это :
B2S(b) ((b)?"true":"false")
тогда вам нужно убедиться, что все, что вы передаете в качестве
'b'
не имеет никаких побочных эффектов. И не забудьте скобки вокруг'b'
Как вы могли бы получить ошибки компиляции.
этот пост старый, но теперь вы можете использовать
std::to_string
преобразовать много переменных, какstd::string
.http://en.cppreference.com/w/cpp/string/basic_string/to_string
использовать
boolalpha
для печати bool в строку.std::cout << std::boolalpha << b << endl; std::cout << std::noboolalpha << b << endl;
Я согласен, что макрос может быть лучше подойдет. Я просто взбил тестовый случай (поверьте мне, я не очень хорошо с C / C++, но это звучало весело):
#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; }