多分これは馬鹿げた質問ですが、ブール値を文字列に変換して、1が「true」になり、0が「false」になるようにする方法はありますか?ifステートメントを使用することもできますが、言語または標準ライブラリでそれを行う方法があるかどうかを知っておくと便利です。さらに、私はペダントです。:)
多分これは馬鹿げた質問ですが、ブール値を文字列に変換して、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;
更新:
あなたが任意のコンソール出力のないコードの4つの以上の行をしたい場合は、をご覧くださいについて話cppreference.comのページstd::boolalpha
とstd::noboolalpha
コンソール出力がショーあなたとAPIについての詳細を説明しています。
さらに、を使用std::boolalpha
すると、のグローバル状態が変更されstd::cout
ます。元の動作を復元したい場合は、の状態を復元するための詳細について、こちらをご覧くださいstd::cout
。
std::string str
可能であれば、変数を作成し、変換結果を変数に保存します。
私たちはC ++について話していますよね?なぜ地球上でまだマクロを使用しているのですか?
C ++インライン関数を使用すると、マクロと同じ速度で、タイプセーフとパラメーター評価の利点が追加されます(これにより、Rodneyと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:このシンプルな関数のために、ブーストライブラリ全体を含めますか?冗談でしょ?
string
、「true」と「false」の文字列定数が静的const変数に格納されている場合に改善できます。
cout << (bool_x ? "true": "false") << endl;
C ++には適切な文字列があるため、それらを使用することもできます。それらは標準のヘッダー文字列にあります。#include <string>を使用します。strcat / strcpyのバッファオーバーランはなくなりました。nullターミネーターが欠落しなくなりました。面倒な手動メモリ管理は不要です。適切な値のセマンティクスを持つ適切にカウントされた文字列。
C ++には、ブール値を人間が読める形式に変換する機能もあります。以前にiostreamの例でヒントを見ましたが、テキストをコンソール(またはfstream、ファイル)にブラストするだけなので、制限は少しあります。幸い、C ++の設計者は完全な馬鹿ではありませんでした。また、コンソールやファイルではなく、自動的に管理される文字列バッファーによってサポートされるiostreamもあります。それらは文字列ストリームと呼ばれます。#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")は、たとえば正しいことを行います。あなたはそれらを数字とともに使用することができ、実際には正しいフォーマットのI / O演算子を持つあらゆるタイプを使用することができます。したがって、それらは非常に用途が広く、便利です。
そして、結局のところ、プロファイリングとベンチマークの結果、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";
}
マクロを使用する場合(または将来のプロジェクトで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
ブールを文字列に出力するために使用します。
std::cout << std::boolalpha << b << endl;
std::cout << std::noboolalpha << b << endl;
このマクロを試してください。「true」またはfalseを表示する場所はどこでも、PRINTBOOL(var)に置き換えるだけです。varは、テキストを取得するブール値です。
#define PRINTBOOL(x) x?"true":"false"