C ++でブールをテキストに変換する


93

多分これは馬鹿げた質問ですが、ブール値を文字列に変換して、1が「true」になり、0が「false」になるようにする方法はありますか?ifステートメントを使用することもできますが、言語または標準ライブラリでそれを行う方法があるかどうかを知っておくと便利です。さらに、私はペダントです。:)


6
異議!ローカリゼーションはどうですか?言語自体に言語固有のリテラル定数が含まれるのはなぜですか?
valdo 2013年

1
@valdo-私が取り組んでいたプロジェクトでは、国際化は問題ではなかったと確信しています。当時、それはおそらく学校のプロジェクトでした。
Jason Baker

回答:


118

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::boolalphastd::noboolalphaコンソール出力がショーあなたとAPIについての詳細を説明しています。

さらに、を使用std::boolalphaすると、のグローバル状態が変更されstd::coutます。元の動作を復元したい場合は、の状態を復元するための詳細について、こちらをご覧くださいstd::cout


私はC ++の完全な初心者です。誰かがこれがどのように機能するかを私に説明できますか?
チャッキー

4
@Chucky 演算子のオーバーロードを理解するまで、これがどのように機能するかを理解することはできません。それがどのように機能するかを説明することは、この質問の範囲をはるかに超えています。別の質問として投稿するか、その質問に対する既存の回答を検索する必要があります。後者をお勧めします。
Michael Dorst 2013

2
これはブール値をテキストとしてのみ出力し、テキスト/文字列に変換しません。
atoMerz 2014

では、OPによって指定された「ブール値を文字列に変換する」基準にどのように失敗するのでしょうか。
graham.reeds

2
このコードはブール値を文字列に変換しません。std::string str可能であれば、変数を作成し、変換結果を変数に保存します。
rozina 2016年

76

私たちは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:このシンプルな関数のために、ブーストライブラリ全体を含めますか?冗談でしょ?


@NathanFellman、受け入れられた答えは遅すぎます。これはstring、「true」と「false」の文字列定数が静的const変数に格納されている場合に改善できます。
Serge Rogatch、2015年

これは問題のある答えです。1。「true」または「false」ではなく「yes」または「no」が必要な場合があります。「success」と「failure」などの場合もあります。ケース、いつかタイトルケース
einpoklum 2016年

2
質問を読んでください、それはまさに要求されたものです。
OJ。

@einpoklum必要な変換のために必要な数のインライン関数を作成することを妨げるものは何もありません。
rozina 2016年

2
クランチでできること:cout << (bool_x ? "true": "false") << endl;
Trevor Boyd Smith

22

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が許容できないボトルネックであることが判明した場合は、マクロホラーの実行を検討する必要があります。


3
boost :: lexical_cast <bool>( "true")がbad_lexical_cast例外をスローするように見える
ユーザー

3
私のアプリでは機能しません、 "isExist:" + boost :: lexical_cast <std :: string>(isExit)); 結果isExist:0
Scott混合理论

7

これは問題ないはずです:


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";
}

5

マクロを使用する場合(または将来のプロジェクトでCを使用する場合)は、マクロ展開の「b」の前後に括弧を追加する必要があります(他のユーザーのコンテンツを編集するのに十分なポイントがありません)。

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

これは、隠れた操作順序エラーから保護する防御的なプログラミング手法です。つまり、これはすべてのコンパイラに対してどのように評価されますか?

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

に比べ

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

2K担当者になる前でも、他の人のコンテンツを編集することができます。見直されますが、もちろん可能です。
SysDragon 2014

2

私はこのようにprintfで三項を使用しています:

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

マクロする場合:

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

次に、'b'副作用がないように、渡すものはすべて確認する必要があります。'b'コンパイルエラーが発生する可能性があるので、括弧を忘れないでください。


「b」はマクロ定義で一度しか表示されないので、なぜ副作用の警告を出すのですか?
ポストフューチュリスト

2

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


1

ostreamをそれにドラッグせずに:

constexpr char const* to_c_str(bool b) {
   return  
    std::array<char const*, 2>{"false", "true "}[b]
   ;
};


0

シンプルはどうですか:

constexpr char const* toString(bool b)
{
   return b ? "true" : "false";
}

-5

マクロが最適だと思う。私はテストケースを作成しました(私は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;
}

-5

文字列をchar配列として直接見ることができる限りstd::string、C ++でファーストクラスシチズンとして文字列を表すことを私に納得させることは本当に難しいでしょう。

その上、割り当てと制限を組み合わせることは、とにかく私にとって悪い考えのようです。


-7

このマクロを試してください。「true」またはfalseを表示する場所はどこでも、PRINTBOOL(var)に置き換えるだけです。varは、テキストを取得するブール値です。

#define PRINTBOOL(x) x?"true":"false"

2
そのマクロにいくつかの括弧が必要です。おそらくこれが反対票を得た理由です。
ポストフューチュリスト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.