【问题标题】:C++ string to boolC++ 字符串到布尔值
【发布时间】: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" 而已。

标签: c++ string boolean


【解决方案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
      猜你喜欢
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      • 2013-06-13
      • 1970-01-01
      • 2019-06-09
      • 2016-01-12
      • 1970-01-01
      • 2011-02-05
      相关资源
      最近更新 更多