Возможно, это глупый вопрос, но есть ли способ конвертировать логическое значение в строку таким образом, что 1 переходит в "true" и 0 превращается в "false"? Я мог бы просто использовать оператор if, но было бы неплохо узнать, есть ли способ сделать это с языковыми или стандартными библиотеками. Плюс, я педант.:)
Преобразование bool в текст в С++
Ответ 1
Как насчет использования самого языка 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
.
Ответ 2
Мы говорим о С++ правильно? Почему мы все еще используем макросы??
Встроенные функции С++ дают вам ту же скорость, что и макрос, с дополнительным преимуществом безопасности типов и оценки параметров (что позволяет избежать вопроса, упомянутого Rodney и 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 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 C, not C++
//printf( BOOL_STR(alpha) );
// use the iostream functionality
std::cout << BoolToString(alpha);
return 0;
}
Приветствия:)
@DrPizza: Включить целую boost lib ради функции это просто? Вы должны шутить?
Ответ 3
C++ имеет правильные строки, так что вы можете использовать их. Они в стандартной строке заголовка. #include <string>, чтобы использовать их. Нет больше переполнений буфера strcat/strcpy; больше нет пропущенных нулевых терминаторов; нет больше грязного ручного управления памятью; строки с правильным подсчетом и семантикой правильных значений.
C++ также имеет возможность преобразовывать bools в удобочитаемые представления. Мы видели намеки на это ранее с примерами iostream, но они немного ограничены, потому что они могут только переносить текст на консоль (или с fstreams, файл). К счастью, дизайнеры C++ не были полными идиотами; у нас также есть iostreams, которые поддерживаются не консолью или файлом, а автоматически управляемым строковым буфером. Они называются струнными потоками. #include <sstream>, чтобы получить их. Тогда мы можем сказать:
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 <bool> ("true") делает правильные вещи. Вы можете использовать их с числами и фактически любым типом с правильными отформатированными операторами ввода-вывода. Так что они довольно универсальны и полезны.
И если после всего этого ваши профилирование и сравнительный анализ выявят, что lexical_casts являются недопустимым узким местом, тогда вам следует подумать о том, чтобы сделать какой-нибудь макро-ужас.
Ответ 4
Это должно быть хорошо:
const char* bool_cast(const bool b) {
return b ? "true" : "false";
}
Но, если вы хотите сделать это больше С++ - 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";
}
Ответ 5
Если вы решите использовать макросы (или используете C в будущем проекте), вы должны добавить круглые скобки вокруг "b" в расширении макроса (у меня нет достаточного количества показов для редактирования контента других людей):
#define BOOL_STR(b) ((b)?"true":"false")
Это защитное программирование, которое защищает от скрытых ошибок порядка операций; то есть, как это оценивается для всех компиляторов?
1 == 2 ? "true" : "false"
по сравнению с
(1 == 2) ? "true" : "false"
Ответ 6
Я использую тернар в printf следующим образом:
printf("%s\n", b?"true":"false");
Если вы выполните макрос:
B2S(b) ((b)?"true":"false")
тогда вам нужно убедиться, что все, что вы передадите, как 'b'
не имеет побочных эффектов. И не забудьте скобки вокруг 'b'
, поскольку вы можете получить ошибки компиляции.
Ответ 7
Этот пост старый, но теперь вы можете использовать std::to_string
для преобразования большого количества переменных в std::string
.
http://en.cppreference.com/w/cpp/string/basic_string/to_string
Ответ 8
Используйте boolalpha
чтобы напечатать bool to string.
std::cout << std::boolalpha << b << endl;
std::cout << std::noboolalpha << b << endl;
Ответ 9
В С++ 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
Ответ 10
Я согласен, что макрос может наилучшим образом соответствовать. Я просто взломал тестовый пример (поверьте мне, что я плохо разбираюсь в 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;
}
Ответ 11
Пока строки можно рассматривать непосредственно как массив char, мне будет очень сложно убедить меня, что std::string
представляет строки как граждане первого класса в С++.
Кроме того, сочетание распределения и ограниченности кажется мне плохой идеей.
Ответ 12
Попробуйте этот макрос. В любом месте, где вы хотите, чтобы "true" или false отображалось, просто замените его PRINTBOOL (var), где var - это bool, для которого требуется текст.
#define PRINTBOOL(x) x?"true":"false"