【问题标题】:convert string to char , space character was not converted correctly将字符串转换为 char ,空格字符未正确转换
【发布时间】:2012-01-07 21:11:13
【问题描述】:

我使用允许我将任何类型(int、double、float、char)转换为字符串的代码。我测试了程序并选择char作为类型值。

stringstream ss;
    string s;
    char c = '3';
    ss << c;
    ss >> s;

    cout << "CHAR" << endl;
    bitset<8> bs2( (char) c );
    for( int i = (int) bs2.size(); i >= 0; i-- )
        cout << bs2[i] << " ";
    cout << endl;

    bitset<8> bs1( (char) s.c_str()[0]);
    cout << "STRING" << endl;
    for( int i = (int) bs1.size(); i >= 0; i-- )
        cout << bs1[i] << " ";
    cout << endl;

输出是

CHAR
0 0 0 0 0 0 0 1 1 
STRING
0 0 0 0 0 0 0 1 1 

但我发现了一件奇怪的事情。我设置了char c = ' ',但值转换不正确。

CHAR
0 0 0 1 0 0 0 0 0 
STRING
0 0 0 0 0 0 0 0 0 

我找不到对此的解释以及我做错了什么。

【问题讨论】:

  • 会不会是提取算子忽略了空格?
  • 嗯,好问题。比我如何将任何类型转换为字符串和字符串转换为任何类型?你有什么建议吗?
  • 另外你确定那是你的真实代码吗?您应该得到bitsets 的“索引超出范围”错误,因为您从超出范围的bs2.size() 开始,而不是bs2.size() - 1
  • 嗯,您是否注意到您的代码打印的是 9 位而不是 8 位? :)
  • 虽然它可能有效,但并不安全。 std::bitset::operator[] 不执行边界检查,但是索引边界值的行为是未定义的。您可以使用std::bitset::test() 来验证这一点,它会执行边界检查。此外,您可以查看输出并看到打印了 9 个数字,这对于其中包含 8 个元素的数组是不正确的。

标签: c++ string char


【解决方案1】:

operator&gt;&gt; for std::string 只会在遇到第一个空白字符之前读取。如果要提取std::stringstream中的所有信息,请使用str()成员函数:

s = ss.str();

参考见operator&gt;&gt;(istream&amp; s, string&amp; str)stringstream::str()的描述

【讨论】:

  • 如果我想转换回来怎么办?某种类型的字符串。我试过了,但效果一样。
  • 我不认为有一种“通用”的方法可以做到这一点,operator&lt;&lt;operator&gt;&gt; 不需要像 std::string 那样对称。您可能需要逐个类型地对此进行调查。对于char,您可以使用std::noskipws 操作符指示流不要跳过空格,例如:ss &gt;&gt; std::noskipws &gt;&gt; c
【解决方案2】:

&gt;&gt; 运算符不会返回空格,请使用ss.str(); 获取字符串流值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-30
    • 2018-05-07
    • 2014-05-16
    • 2012-01-16
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 2018-03-27
    相关资源
    最近更新 更多