Talvez esta seja uma pergunta idiota, mas há alguma maneira de converter um valor booleano em uma string de forma que 1 se transforme em "verdadeiro" e 0 em "falso"? Eu poderia apenas usar uma instrução if, mas seria bom saber se existe uma maneira de fazer isso com a linguagem ou bibliotecas padrão. Além disso, sou um pedante. :)
93
Respostas:
Que tal usar a própria linguagem C ++?
ATUALIZAR:
Se você quiser mais de 4 linhas de código sem nenhuma saída do console, vá para a página cppreference.com falando sobre
std::boolalpha
estd::noboolalpha
que mostra a saída do console e explica mais sobre a API.Além disso, o uso de
std::boolalpha
irá modificar o estado global destd::cout
, você pode querer restaurar o comportamento original vá aqui para obter mais informações sobre como restaurar o estado destd::cout
.fonte
std::string str
e salve o resultado da conversão nela, se puder.Estamos falando sobre C ++ certo? Por que diabos ainda estamos usando macros !?
As funções embutidas do C ++ oferecem a mesma velocidade de uma macro, com o benefício adicional de segurança de tipo e avaliação de parâmetro (o que evita o problema mencionado por Rodney e dwj.
Além disso, tenho algumas outras queixas, principalmente com a resposta aceita :)
Felicidades :)
@DrPizza: Incluir uma biblioteca completa de boost por causa de uma função tão simples? Você só pode estar brincando?
fonte
string
se as constantes de string para "true" e "false" forem armazenadas em variáveis const estáticas.cout << (bool_x ? "true": "false") << endl;
C ++ tem strings adequadas, então você também pode usá-las. Eles estão na string de cabeçalho padrão. #include <string> para usá-los. Chega de estouros de buffer strcat / strcpy; não há mais terminadores nulos ausentes; não há mais gerenciamento de memória manual confuso; strings contadas corretamente com semântica de valor adequada.
C ++ tem a capacidade de converter bools em representações legíveis por humanos também. Vimos dicas sobre isso antes com os exemplos do iostream, mas eles são um pouco limitados porque só podem enviar o texto para o console (ou com fstreams, um arquivo). Felizmente, os designers do C ++ não eram idiotas completos; também temos iostreams que são apoiados não pelo console ou um arquivo, mas por um buffer de string gerenciado automaticamente. Eles são chamados de streams. #include <sstream> para obtê-los. Então podemos dizer:
Claro, não queremos digitar tudo isso. Felizmente, C ++ também tem uma biblioteca de terceiros conveniente chamada Boost que pode nos ajudar aqui. Boost tem uma função legal chamada lexical_cast. Podemos usá-lo assim:
Agora, é verdade que essa sobrecarga é mais alta do que alguma macro; stringstreams lidam com locais com os quais você pode não se importar e criam uma string dinâmica (com alocação de memória), enquanto a macro pode gerar uma string literal, o que evita isso. Mas, por outro lado, o método stringstream pode ser usado para muitas conversões entre representações imprimíveis e internas. Você pode executá-los ao contrário; boost :: lexical_cast <bool> ("true") faz a coisa certa, por exemplo. Você pode usá-los com números e, na verdade, qualquer tipo com os operadores de E / S formatados corretamente. Portanto, eles são bastante versáteis e úteis.
E se depois de tudo isso seu perfil e benchmarking revelarem que os lexical_casts são um gargalo inaceitável, é quando você deve considerar fazer algum terror macro.
fonte
Isso deve estar bem:
Mas, se você quiser fazer mais C ++ - ish:
fonte
Se você decidir usar macros (ou estiver usando C em um projeto futuro), deve adicionar parênteses ao redor de 'b' na expansão da macro (ainda não tenho pontos suficientes para editar o conteúdo de outras pessoas):
Esta é uma técnica de programação defensiva que protege contra erros ocultos de ordem de operações; ou seja, como isso é avaliado para todos os compiladores?
comparado com
fonte
Eu uso um ternário em um printf assim:
Se você macro:
então você precisa ter certeza de que tudo o que você passa
'b'
não tem efeitos colaterais. E não se esqueça dos colchetes ao redor do,'b'
pois você pode obter erros de compilação.fonte
Com C ++ 11, você pode usar um lambda para obter um código um pouco mais compacto e uso local:
Impressões:
fonte
Este post é antigo, mas agora você pode usar
std::to_string
para converter muitas variáveis comostd::string
.http://en.cppreference.com/w/cpp/string/basic_string/to_string
fonte
Sem arrastar ostream para ele:
fonte
Use
boolalpha
para imprimir o bool em string.Referência C ++
fonte
Que tal o simples:
fonte
Concordo que uma macro pode ser o melhor ajuste. Acabei de preparar um caso de teste (acredite, não sou bom em C / C ++, mas parecia divertido):
fonte
Contanto que as strings possam ser vistas diretamente como um array de char, será muito difícil me convencer de que as strings são vistas como
std::string
cidadãos de primeira classe em C ++.Além disso, combinar alocação e limitação parece ser uma má ideia para mim de qualquer maneira.
fonte
Experimente esta macro. Em qualquer lugar que você quiser que o "verdadeiro" ou falso apareça, basta substituí-lo por PRINTBOOL (var) onde var é o bool para o qual você deseja o texto.
fonte