Преобразование bool в текст на C++

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

Возражение! А как насчет локализации? Почему сам язык должен содержать специфичные для языка буквальные константы?

valdo 29.05.2013 02:28

@valdo - я почти уверен, что для проекта, над которым я работал, интернационализация не была проблемой. В то время это был скорее школьный проект.

Jason Baker 01.06.2013 23:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
97
2
169 670
15
Перейти к ответу Данный вопрос помечен как решенный

Ответы 15

Я согласен, что лучше всего подойдет макрос. Я только что придумал тестовый пример (поверьте, я плохо разбираюсь в 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"

В этом макросе нужны круглые скобки, вероятно, поэтому вы получили отрицательный голос.

postfuturist 26.10.2008 01:45

Я использую тернар в printf вот так:

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

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

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

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

Поскольку «b» появляется в определении макроса только один раз, почему вы предупреждаете о побочных эффектах?

postfuturist 26.10.2008 01:42

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

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

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

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

в сравнении с

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

Даже до того, как у вас появилось 2k репутации, вы действительно могли редактировать чужой контент. Он будет рассмотрен, но, конечно, можно.

SysDragon 05.08.2014 12:49
Ответ принят как подходящий

Как насчет использования самого языка 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 20.02.2013 18:06

@Chucky Вы не сможете понять, как это работает, пока не поймете перегрузка оператора. Объяснение того, как это работает, выходит далеко за рамки этого вопроса. Вам нужно будет либо опубликовать его как другой вопрос, либо найти существующие ответы на этот вопрос. Я рекомендую последнее.

Michael Dorst 09.04.2013 15:55

Это печатает только логические значения как текст, но не преобразует их в текст / строку.

atoMerz 24.02.2014 16:47

Итак, каким образом это не соответствует критериям «преобразовать логическое значение в строку», заданным OP?

graham.reeds 25.02.2014 13:18

Это решение слишком медленное для C++.

Serge Rogatch 16.11.2015 08:15

OP не запрашивал исполнительскую версию. И я не знал, что C++ имеет минимальные критерии производительности для iostream.

graham.reeds 16.11.2015 09:30

Этот код не преобразует логическое значение в строку. Создайте переменную std::string str и сохраните в нее результат преобразования, если сможете.

rozina 29.03.2016 16:11

@rozina Преобразует его в поток символов, который можно легко сохранить в строку.

graham.reeds 29.03.2016 16:59

Разве вам не нужно прибегать к (bool). В противном случае компилятор может пожаловаться на ошибка: недопустимые операнды типов const char

IgorGanapolsky 15.04.2016 23:01

хорошо, ты можешь сказать мне, как им пользоваться?

CrazyVideoGamez 25.02.2021 21:54

@CrazyVideoGamez С какой частью у вас проблемы?

graham.reeds 26.02.2021 04:09

@ graham.reeds, что означает std::cout << std::noboolalpha << t << " == " << std::boolalpha << t << std::endl; и как я должен его использовать

CrazyVideoGamez 26.02.2021 08:12

@CrazyVideoGamez Если вы хотите отобразить bool как текст, вы можете использовать манипулятор std :: boolalpha для отображения bool как текстового представления. Например: 1 отображается как истина. Чтобы выключить манипулятор, вы используете std :: noboolalpha. Если вы хотите, чтобы логическое значение отображалось не как true или false (например, включено или выключено), вы можете использовать do_truename и do_falsename соответственно.

graham.reeds 27.02.2021 02:30

@ graham.reeds хорошо круто

CrazyVideoGamez 28.02.2021 18:09

Мы ведь говорим о 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, если строковые константы для «истина» и «ложь» хранятся в статических константных переменных.

Serge Rogatch 16.11.2015 08:17

Это проблематичный ответ, поскольку: 1. Иногда вам нужно «да» или «нет», а не «истина или ложь», а иногда «успех» или «неудача» и т. д. 2. Иногда вам нужны строчные буквы, иногда верхние. случай, иногда заглавный регистр.

einpoklum 24.01.2016 15:47

Прочтите вопрос, это именно то, что просили.

OJ. 26.01.2016 05:08

@einpoklum Ничто не мешает вам создать столько встроенных функций для желаемых преобразований, сколько вы хотите.

rozina 29.03.2016 16:12

в кранче вы можете: cout << (bool_x ? "true": "false") << endl;

Trevor Boyd Smith 27.07.2018 19:28

Когда дело доходит до однострочного кода, макросы намного быстрее, чем inline.

Beyondo 06.01.2019 18:00

@Beyondo нет, нет. Макрос просто заменяет эту часть исходного кода. Встроенная функция, такая же тривиальная, как макрос, также будет заменена на место и не будет добавлять никаких вызовов функций, преобразований или чего-либо еще, но с преимуществом безопасности типов.

ABaumstumpf 05.03.2020 17:37

В 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 есть замечательная функция под названием lexical_cast. Мы можем использовать это так:

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

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

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

boost :: lexical_cast("true"), похоже, вызывает исключение bad_lexical_cast

User 28.09.2011 02:31

не работает в моем приложении "isExist:" + boost :: lexical_cast<:string>(isExit)); результаты isExist: 0

Scott 混合理论 23.01.2014 08:01

Это должно быть нормально:


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», а не «истина» или «ложь».

David Ellis 27.06.2018 10:53

Используйте boolalpha для печати bool в строку.

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

Справочник по C++

В 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

Другие вопросы по теме