将std :: string转换为bool的最佳方法是什么?我正在调用一个返回“0”或“1”的函数,我需要一个干净的解决方案来将其转换为布尔值。
答案 0 :(得分:80)
我很惊讶没人提到这个:
bool b;
istringstream("1") >> b;
或
bool b;
istringstream("true") >> std::boolalpha >> b;
答案 1 :(得分:44)
bool to_bool(std::string const& s) {
return s != "0";
}
答案 2 :(得分:32)
这对你来说可能有些过分,但我会使用boost::lexical_cast
boost::lexical_cast<bool>("1") // returns true
boost::lexical_cast<bool>("0") // returns false
答案 3 :(得分:12)
您是否关心返回值无效的可能性,或者您不关心。到目前为止,大多数答案处于中间位置,除了“0”和“1”之外还有一些字符串,或许可以理解它们应该如何转换,也许会引发异常。 无效输入无法生成有效输出,您不应尝试接受它。
如果您不关心无效退货,请使用s[0] == '1'
。它非常简单明了。如果你必须证明它对某人的容忍度,说它将无效输入转换为false,并且空字符串可能是STL实现中的单个\0
,因此它相当稳定。 s == "1"
也很好,但s != "0"
对我来说似乎很迟钝而且无效=&gt;真。
如果您确实关心错误(可能应该),请使用
if ( s.size() != 1
|| s[0] < '0' || s[0] > '1' ) throw input_exception();
b = ( s[0] == '1' );
这会捕获所有错误,对于任何知道C的smidgen的人来说,这也是非常明显和简单的,并且没有什么会更快地执行。
答案 4 :(得分:6)
c ++ 11中还有std :: stoi:
bool value = std :: stoi(someString.c_str());
答案 5 :(得分:2)
写一个免费功能:
bool ToBool( const std::string & s ) {
return s.at(0) == '1';
}
这是最简单的事情,但你需要问问自己:
我确信还有其他人 - 这是API设计的乐趣!
答案 6 :(得分:2)
我会使用它,它会做你想要的,并捕获错误案例。
bool to_bool(const std::string& x) {
assert(x == "0" || x == "1");
return x == "1";
}
答案 7 :(得分:1)
我会改变首先返回此字符串的丑陋函数。这就是布尔所用的。
答案 8 :(得分:0)
试试这个:
bool value;
if(string == "1")
value = true;
else if(string == "0")
value = false;
答案 9 :(得分:0)
bool to_bool(std::string const &string) {
return string[0] == '1';
}
答案 10 :(得分:0)
这是一种类似于Kyle的方式,除了它处理前导零和东西:
bool to_bool(std::string const& s) {
return atoi(s.c_str());
}
答案 11 :(得分:0)
您始终可以将返回的字符串包装在处理布尔字符串概念的类中:
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"
。
答案 12 :(得分:0)
DavidL's answer是最好的,但我发现自己想同时支持两种形式的布尔输入。因此,主题有一个较小的变化(以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”
答案 13 :(得分:0)
如果需要“ true”和“ false”字符串支持,请考虑使用Boost ...
BOOST_TEST(convert<bool>( "true", cnv(std::boolalpha)).value_or(false) == true);
BOOST_TEST(convert<bool>("false", cnv(std::boolalpha)).value_or( true) == false);
BOOST_TEST(convert<bool>("1", cnv(std::noboolalpha)).value_or(false) == true);
BOOST_TEST(convert<bool>("0", cnv(std::noboolalpha)).value_or( true) == false);