2012-01-07 91 views
1

我使用允许将任何类型(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 

我找不到解释和我做错了什么。

+0

难道是提取操作符忽略空格? – 2012-01-07 21:13:16

+0

嗯,好问题。比如何将任何类型转换为字符串和字符串为任何类型?你有什么建议吗? – 2012-01-07 21:15:03

+1

你是否确定这是你的真实代码?你应该得到一个“索引超出范围”的错误,因为你从'bs2.size()'开始,这是超出界限的,而不是'bs2.size() - 1' – 2012-01-07 21:18:02

回答

3

operator>>对于std::string只会读取,直到遇到第一个空白字符。如果你想提取所有的在std::stringstream的信息,使用str()成员函数:

s = ss.str(); 

仅供参考看到operator>>(istream& s, string& str)stringstream::str()

+0

如果我想转换回来,怎么样?字符串到某种类型。我尝试过,但它有相同的影响。 – 2012-01-07 21:29:22

+1

我不认为有一个“通用”的方式来做到这一点,运算符<<和运算符>>不需要是对称的,因为你已经看到了'std :: string'。您可能需要逐个类型地进行调查。在使用'char'的情况下,可以通过'std :: noskipws'操纵符指示流不跳过空格,例如:'ss >> std :: noskipws >> c'。 – DRH 2012-01-07 21:44:51

2

的描述>>运营商将不会返回的空间,使用ss.str();获取stringstream值。