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





Я согласен, что лучше всего подойдет макрос. Я только что придумал тестовый пример (поверьте, я плохо разбираюсь в 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;
}
Попробуйте этот макрос. Везде, где вы хотите, чтобы отображалось значение «true» или «false», просто замените его на PRINTBOOL (var), где var - это логическое значение, для которого вы хотите ввести текст.
#define PRINTBOOL(x) x?"true":"false"
В этом макросе нужны круглые скобки, вероятно, поэтому вы получили отрицательный голос.
Я использую тернар в printf вот так:
printf("%s\n", b?"true":"false");
Если вы сделаете макрос:
B2S(b) ((b)?"true":"false")
тогда вам нужно убедиться, что все, что вы передаете как 'b', не имеет побочных эффектов. И не забудьте скобки вокруг 'b', так как вы можете получить ошибки компиляции.
Поскольку «b» появляется в определении макроса только один раз, почему вы предупреждаете о побочных эффектах?
Если вы решите использовать макросы (или используете C в будущем проекте), вы должны добавить скобки вокруг «b» в раскрытии макроса (у меня пока недостаточно очков для редактирования чужого контента):
#define BOOL_STR(b) ((b)?"true":"false")
Это метод защитное программирование, который защищает от скрытых ошибок порядка операций; т.е. как это оценивается для компиляторов все?
1 == 2 ? "true" : "false"
в сравнении с
(1 == 2) ? "true" : "false"
Даже до того, как у вас появилось 2k репутации, вы действительно могли редактировать чужой контент. Он будет рассмотрен, но, конечно, можно.
Как насчет использования самого языка 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.
Я новичок в C++. Может кто-нибудь объяснить мне, как это работает?
@Chucky Вы не сможете понять, как это работает, пока не поймете перегрузка оператора. Объяснение того, как это работает, выходит далеко за рамки этого вопроса. Вам нужно будет либо опубликовать его как другой вопрос, либо найти существующие ответы на этот вопрос. Я рекомендую последнее.
Это печатает только логические значения как текст, но не преобразует их в текст / строку.
Итак, каким образом это не соответствует критериям «преобразовать логическое значение в строку», заданным OP?
Это решение слишком медленное для C++.
OP не запрашивал исполнительскую версию. И я не знал, что C++ имеет минимальные критерии производительности для iostream.
Этот код не преобразует логическое значение в строку. Создайте переменную std::string str и сохраните в нее результат преобразования, если сможете.
@rozina Преобразует его в поток символов, который можно легко сохранить в строку.
Разве вам не нужно прибегать к (bool). В противном случае компилятор может пожаловаться на ошибка: недопустимые операнды типов const char
хорошо, ты можешь сказать мне, как им пользоваться?
@CrazyVideoGamez С какой частью у вас проблемы?
@ graham.reeds, что означает std::cout << std::noboolalpha << t << " == " << std::boolalpha << t << std::endl; и как я должен его использовать
@CrazyVideoGamez Если вы хотите отобразить bool как текст, вы можете использовать манипулятор std :: boolalpha для отображения bool как текстового представления. Например: 1 отображается как истина. Чтобы выключить манипулятор, вы используете std :: noboolalpha. Если вы хотите, чтобы логическое значение отображалось не как true или false (например, включено или выключено), вы можете использовать do_truename и do_falsename соответственно.
@ graham.reeds хорошо круто
Мы ведь говорим о 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: Включить целую библиотеку ускорения ради такой простой функции? Ты наверное шутишь?
@NathanFellman, принятый ответ слишком медленный. Это может быть улучшено для string, если строковые константы для «истина» и «ложь» хранятся в статических константных переменных.
Это проблематичный ответ, поскольку: 1. Иногда вам нужно «да» или «нет», а не «истина или ложь», а иногда «успех» или «неудача» и т. д. 2. Иногда вам нужны строчные буквы, иногда верхние. случай, иногда заглавный регистр.
Прочтите вопрос, это именно то, что просили.
@einpoklum Ничто не мешает вам создать столько встроенных функций для желаемых преобразований, сколько вы хотите.
в кранче вы можете: cout << (bool_x ? "true": "false") << endl;
Когда дело доходит до однострочного кода, макросы намного быстрее, чем inline.
@Beyondo нет, нет. Макрос просто заменяет эту часть исходного кода. Встроенная функция, такая же тривиальная, как макрос, также будет заменена на место и не будет добавлять никаких вызовов функций, преобразований или чего-либо еще, но с преимуществом безопасности типов.
В C++ есть правильные строки, так что вы можете их использовать. Они находятся в стандартной строке заголовка. #include
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 есть замечательная функция под названием lexical_cast. Мы можем использовать это так:
boost::lexical_cast<std::string>(my_bool)
Верно сказать, что это более высокие накладные расходы, чем некоторые макросы; строковые потоки имеют дело с языковыми стандартами, которые могут вас не беспокоить, и создают динамическую строку (с выделением памяти), тогда как макрос может выдавать буквальную строку, что позволяет избежать этого. Но с другой стороны, метод stringstream можно использовать для множества преобразований между печатным и внутренним представлениями. Вы можете запустить их в обратном направлении; boost :: lexical_cast
И если после всего этого ваше профилирование и бенчмаркинг покажут, что lexical_casts являются неприемлемым узким местом, это, когда вам следует подумать о том, чтобы сделать некоторый макро-ужас.
boost :: lexical_cast
не работает в моем приложении "isExist:" + boost :: lexical_cast<:string>(isExit)); результаты isExist: 0
Это должно быть нормально:
const char* bool_cast(const bool b) {
return b ? "true" : "false";
}
Но, если вы хотите сделать это больше, C++ - иш:
#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";
}
Пока строки можно рассматривать непосредственно как массив символов, будет очень сложно убедить меня, что std::string представляет строки как первоклассные граждане в C++.
Кроме того, комбинирование выделения и ограниченности в любом случае кажется мне плохой идеей.
Этот пост старый, но теперь вы можете использовать std::to_string для преобразования большого количества переменных в std::string.
http://en.cppreference.com/w/cpp/string/basic_string/to_string
Вы можете, но если вы сделаете это с переменной типа bool, она просто преобразует числовое значение «1» или «0», а не «истина» или «ложь».
Используйте boolalpha для печати bool в строку.
std::cout << std::boolalpha << b << endl;
std::cout << std::noboolalpha << b << endl;
В 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
Не перетаскивая в него ostream:
constexpr char const* to_c_str(bool b) {
return
std::array<char const*, 2>{"false", "true "}[b]
;
};
Как насчет простого:
constexpr char const* toString(bool b)
{
return b ? "true" : "false";
}
C++ 20 std::format("{}"
https://en.cppreference.com/w/cpp/utility/format/formatter#Standard_format_specification утверждает, что форматом вывода по умолчанию будет строка по умолчанию:
auto s6 = std::format("{:6}", true); // value of s6 is "true "
и:
The available bool presentation types are:
- none, s: Copies textual representation (true or false, or the locale-specific form) to the output.
- b, B, c, d, o, x, X: Uses integer presentation types with the value static_cast(value).
Связанный: std :: string форматирование, как sprintf
Возражение! А как насчет локализации? Почему сам язык должен содержать специфичные для языка буквальные константы?