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++ 没有解析器 &gt;&gt; 的文档是怎么说的?它是否说它支持任意布尔表达式?我的没有。 @linkas 我不清楚你想要什么,你是否期望to_bool 接受string 并将其评估为逻辑表达式? 是的。我不确定我是否做对了,但这个函数处理简单的请求(如“true || false”等) &gt;&gt; 不是布尔表达式解析器。它只是用来转换"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的类型是boolboolalpha!=0,下面替换 阶段 2 和 3:从输入迭代器获得的连续字符 in 与从获得的字符序列匹配 std::use_facet&lt;std::numpunct&lt;charT&gt;&gt;(str.getloc()).falsename()std::use_facet&lt;std::numpunct&lt;charT&gt; &gt;(str.getloc()).truename() 仅作为 识别唯一匹配所必需的。中的输入迭代器是 仅在需要获取字符时才与 end 进行比较。如果 目标序列唯一匹配,v设置为对应的 布尔值。否则 false 存储在 v 和 std::ios_base::failbit 中 分配给错误。如果在 输入结束(in==end)err|=std::ios_base::eofbit被执行。

【讨论】:

【参考方案3】:

你说:

它应该打印 1 而不是 0。

您没有检查is &gt;&gt; boolalpha &gt;&gt; b; 是否成功将任何内容读入b

这里有一些尝试:

is >> boolalpha >> b;
if ( ! is.good() )

    // Do something to deal with the error.

【讨论】:

不需要初始化b @Slava,初始化局部变量不是必需的,但总是好的。 也许这是一个很好的做法,但在这种情况下我不会认为这是一个问题。 @Slava,这本身不是问题。 OP 得到了错误的印象,即 bis &gt;&gt; boolalpha &gt;&gt; b; 设置为 false。如果b 初始化为true,希望他们会注意到b 中没有读入任何内容。 为什么这种印象是错误的?根据文档(见我的回答)std::istream::operator&gt;&gt; 在这种情况下确实将b 设置为false

以上是关于C++ 字符串到布尔值的主要内容,如果未能解决你的问题,请参考以下文章

为啥 ~(true^true) 不正确?布尔运算符(否定)适用于“无符号字符”,但不适用于布尔值? (C++)

布尔值到字符串的聚合更改值

C++,布尔数组未正确初始化

Pandas 映射到 TRUE/FALSE 作为字符串,而不是布尔值

C到C++

PL/SQL 将字符串转换为布尔值