Вопрос

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

Это было полезно?

Решение

Как насчет использования самого языка 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++, верно?С какой стати мы до сих пор используем макросы!?

Встроенные функции 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:Включить целую библиотеку повышения ради такой простой функции?Ты наверное шутишь?

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

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

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

Можно сказать, что это более высокие накладные расходы, чем некоторые макросы;строковые потоки имеют дело с локалями, которые могут вас не волновать, и создают динамическую строку (с выделением памяти), тогда как макрос может возвращать литеральную строку, что позволяет избежать этого.Но с другой стороны, метод stringstream можно использовать для очень многих преобразований между печатными и внутренними представлениями.Вы можете запустить их задом наперед;Например, boost::lexical_cast<bool>("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' так как вы можете получить ошибки компиляции.

В 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

Этот пост старый, но теперь вы можете использовать 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;
}

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

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

Попробуйте этот макрос.Везде, где вы хотите, чтобы «истина» или «ложь» отображались, просто замените их на PRINTBOOL(var), где var — это логическое значение, для которого вы хотите получить текст.

#define PRINTBOOL(x) x?"true":"false"
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top