2012-01-07 112 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值。