Как зайти в Даркнет?!
25th January, 01:11
94
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
1228
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
1029
0
Очень долго работает Update запрос Oracle
27th January, 09:58
969
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
959
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
995
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1782
0
период по дням
25th October, 10:44
4001
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3775
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4661
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4442
0
Помогите пожалуйста решить задачи
24th November, 23:53
6159
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4393
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4442
0
Метода Крамера С++
23rd October, 11:55
4356
0
помогите решить задачу на C++
22nd October, 17:31
4040
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4533
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2643
0
Преобразование bool в текст в C++
Может быть, это глупый вопрос, но есть ли способ преобразовать логическое значение в строку таким образом, что 1 превращается в "true", а 0-в "false"? Я мог бы просто использовать оператор 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;
UPDATE:
Если вы хотите получить более 4 строк кода без вывода на консоль, пожалуйста, перейдите на страницу cppreference.com's, рассказывающую о std::boolalpha и std::noboolalpha , которая показывает вам вывод на консоль и объясняет больше о API.
Кроме того, использование std::boolalpha изменит глобальное состояние std::cout , вы можете захотеть восстановить исходное поведение перейдите сюда для получения дополнительной информации о восстановлении состояния std::cout .
Мы ведь говорим о C++, верно? С какой стати мы до сих пор используем macros!?
Встроенные функции 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: включить весь boost lib ради такой простой функции? Ты, наверное, шутишь?
C++ имеет правильные строки, так что вы можете также использовать их. Они находятся в стандартной строке заголовка. #include <string> чтобы использовать их. Нет больше переполнения буфера strcat/strcpy; нет больше отсутствующих Терминаторов null; нет больше беспорядочного ручного управления памятью; правильные подсчитанные строки с правильной семантикой значений.
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)
Теперь верно сказать, что это выше накладных расходов, чем некоторые макросы; stringstreams имеют дело с локалями, которые могут вас не волновать, и создают динамическую строку (с выделением памяти), тогда как макрос может выдавать литеральную строку, что позволяет избежать этого. Но с другой стороны, метод stringstream можно использовать для очень многих преобразований между печатаемыми и внутренними представлениями. Вы можете запустить их в обратном направлении; boost::lexical_cast<bool>("true") делает правильную вещь, например. Вы можете использовать их с числами и фактически любым типом с правильными форматированными операторами ввода-вывода. Так что они довольно универсальны и полезны.
И если после всего этого ваше профилирование и бенчмаркинг показывают, что lexical_casts являются неприемлемым узким местом, именно тогда вам следует подумать о том, чтобы сделать некоторые макро-ужасы.
Это должно быть прекрасно:
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";
}
Если вы решите использовать macros (или используете C в будущем проекте), вам следует добавить скобки вокруг 'b' в расширении макроса (у меня пока недостаточно точек для редактирования содержимого других людей):
#define BOOL_STR(b) ((b)?"true":"false")
Это защитный метод программирования , который защищает от скрытых ошибок order-of-operations; то есть, как это оценивается для всех компиляторов?
1 == 2 ? "true" : "false"
по сравнению с
(1 == 2) ? "true" : "false"
Я использую тернарное число в printf, как это:
printf("%s\n", b?"true":"false");
Если вам это нравится :
B2S(b) ((b)?"true":"false")
затем вам нужно убедиться, что все, что вы передаете в качестве 'b' , не имеет никаких побочных эффектов. И не забывайте о скобках вокруг 'b' , так как вы можете получить ошибки компиляции.
С C++11 вы можете использовать lambda, чтобы получить немного более компактный код и использовать его на месте:
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
Я согласен, что макрос может быть лучше всего подходит. Я только что взялся за тестовый случай (поверьте мне, я не очень хорошо справляюсь с 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;
}