C++ 字符串到布尔值
Posted
技术标签:
【中文标题】C++ 字符串到布尔值【英文标题】:C++ string to bool 【发布时间】:2015-02-07 18:44:46 【问题描述】:我认为我的 string to bool 函数不能正常工作。它无法处理条件 -
! ! ! !真的 && 真的
。它应该打印 1 而不是 0。
bool to_bool(string str)
transform(str.begin(), str.end(), str.begin(), ::tolower);
istringstream is(str);
bool b;
is >> boolalpha >> b;
return b;
int main()
if(to_bool("! ! ! ! true && true"))
cout <<1;
else
cout <<0;
return 0;
有什么想法吗?
【问题讨论】:
标准 C++ 没有解析器>>
的文档是怎么说的?它是否说它支持任意布尔表达式?我的没有。
@linkas 我不清楚你想要什么,你是否期望to_bool
接受string
并将其评估为逻辑表达式?
是的。我不确定我是否做对了,但这个函数处理简单的请求(如“true || false”等)
>>
不是布尔表达式解析器。它只是用来转换"true"
或"false"
而已。
【参考方案1】:
我很惊讶没有人提到这个:
bool b;
istringstream("1") >> b;
或
bool b;
istringstream("true") >> std::boolalpha >> b;
【讨论】:
【参考方案2】:我不知道您为什么希望 std::istream
解析和评估布尔表达式,但根据文档不应该这样(来自 http://en.cppreference.com/w/cpp/locale/num_get/get):
如果v的类型是
bool
和boolalpha!=0
,下面替换 阶段 2 和 3:从输入迭代器获得的连续字符 in 与从获得的字符序列匹配std::use_facet<std::numpunct<charT>>(str.getloc()).falsename()
和std::use_facet<std::numpunct<charT> >(str.getloc()).truename()
仅作为 识别唯一匹配所必需的。中的输入迭代器是 仅在需要获取字符时才与 end 进行比较。如果 目标序列唯一匹配,v设置为对应的 布尔值。否则 false 存储在 v 和std::ios_base::failbit
中 分配给错误。如果在 输入结束(in==end)
,err|=std::ios_base::eofbit
被执行。
【讨论】:
【参考方案3】:你说:
它应该打印 1 而不是 0。
您没有检查is >> boolalpha >> b;
是否成功将任何内容读入b
。
这里有一些尝试:
is >> boolalpha >> b;
if ( ! is.good() )
// Do something to deal with the error.
【讨论】:
不需要初始化b
@Slava,初始化局部变量不是必需的,但总是好的。
也许这是一个很好的做法,但在这种情况下我不会认为这是一个问题。
@Slava,这本身不是问题。 OP 得到了错误的印象,即 b
被 is >> boolalpha >> b;
设置为 false
。如果b
初始化为true
,希望他们会注意到b
中没有读入任何内容。
为什么这种印象是错误的?根据文档(见我的回答)std::istream::operator>>
在这种情况下确实将b
设置为false
。以上是关于C++ 字符串到布尔值的主要内容,如果未能解决你的问题,请参考以下文章
为啥 ~(true^true) 不正确?布尔运算符(否定)适用于“无符号字符”,但不适用于布尔值? (C++)