web-dev-qa-db-ja.com

std :: stringからboolへの変換

Std :: stringをboolに変換する最良の方法は何ですか? 「0」または「1」を返す関数を呼び出していますが、これをブール値に変換するためのクリーンなソリューションが必要です。

46
cquillen

おそらくあなたにとってはやりすぎでしょうが、私は boost :: lexical_cast を使用します

boost::lexical_cast<bool>("1") // returns true
boost::lexical_cast<bool>("0") // returns false
32

私は誰もこれについて言及していないことに驚いています:

bool b;
istringstream("1") >> b;

または

bool b;
istringstream("true") >> std::boolalpha >> b;
83
David L.
bool to_bool(std::string const& s) {
     return s != "0";
}
45

無効な戻り値の可能性を気にするか、気にしません。これまでのほとんどの答えは中途半端で、「0」と「1」以外のいくつかの文字列をキャッチし、おそらく変換する方法を合理化し、おそらく例外をスローします。 無効な入力は有効な出力を生成できないため、受け入れようとしないでください。

無効な返品を気にしない場合は、s[0] == '1'。それは非常にシンプルで明白です。誰かにその許容範囲を正当化する必要がある場合、無効な入力をfalseに変換し、空の文字列は単一の\0をSTL実装で使用しているため、かなり安定しています。 s == "1"も良いですが、s != "0"は私には鈍感で、無効=> trueにします。

エラーを気にする場合(そして、そうすべきである場合)、

if ( s.size() != 1
 || s[0] < '0' || s[0] > '1' ) throw input_exception();
b = ( s[0] == '1' );

これはすべてのエラーをキャッチします。また、Cのsmidgenを知っている人にとっては率直に言って明白で単純であり、何も速く実行されません。

12
Potatoswatter

C++ 11にはstd :: stoiもあります:

bool value = std :: stoi(someString.c_str());

6
Mike

私はこれを使用しますが、これはあなたが望むことを行い、エラーケースをキャッチします。

bool to_bool(const std::string& x) {
  assert(x == "0" || x == "1");
  return x == "1";
}
3
user97370

無料の関数を書く:

bool ToBool( const std::string & s ) {
   return s.at(0) == '1';
}

これは動作する可能性のある最も簡単なものですが、自分で確認する必要があります。

  • 空の文字列は何を返すべきですか?上記のバージョンは例外をスローします
  • 「1」または「0」以外の文字は何に変換する必要がありますか?
  • 複数の文字の文字列は、関数の有効な入力ですか?

他にもあるはずです-これがAPIデザインの喜びです!

2
anon

最初にこの文字列を返すreturnsい関数を変更します。それがboolの目的です。

1
rmn

DavidLの答え が最適ですが、同時にboth形式のブール入力をサポートしたいと思っています。テーマのマイナーバリエーション( std::stoi ):

bool stob(std::string s, bool throw_on_error = true)
{
    auto result = false;    // failure to assert is false

    std::istringstream is(s);
    // first try simple integer conversion
    is >> result;

    if (is.fail())
    {
        // simple integer failed; try boolean
        is.clear();
        is >> std::boolalpha >> result;
    }

    if (is.fail() && throw_on_error)
    {
        throw std::invalid_argument(s.append(" is not convertable to bool"));
    }

    return result;
}

これは、有効な入力として「0」、「1」、「true」、および「false」をサポートします。残念ながら、「TRUE」と「FALSE」もサポートする移植可能な方法がわかりません

1
jwm

これは、先頭のゼロなどを処理することを除いて、Kyleの方法と似ています。

bool to_bool(std::string const& s) {
     return atoi(s.c_str());
}
0

これを試して:

bool value;

if(string == "1")
    value = true;
else if(string == "0")
    value = false;
0
Kyle Lutz
bool to_bool(std::string const &string) { 
    return string[0] == '1';
}
0
Jerry Coffin

返された文字列は、ブール文字列の概念を処理するクラスで常にラップできます。

class BoolString : public string
{
public:
    BoolString(string const &s)
    :   string(s)
    {
        if (s != "0" && s != "1")
        {
            throw invalid_argument(s);
        }
    }

    operator bool()
    {
        return *this == "1";
    }
}

次のようなものを呼び出します。

BoolString bs(func_that_returns_string());
if (bs) ...;
else ...;

invalid_argumentについてのルール"0"および"1"に違反しています。

0
Matt Joiner