2013-06-05 79 views
4

下面的字符串轉換爲字符串的正確結果是什麼?boost :: lexical_cast和std :: to_string對於無符號字符的正確結果是什麼

聽說老升壓版本1.46 lexical_cast的產量爲,我沒有那個版本的靠近我,我不能測試它。但 升壓庫(1.49)的輸出是:8

unsigned char c= 56; 
    std::string s = boost::lexical_cast<std::string>(c); 
    std::cout << "boost::lexical_cast: " << s << std::endl; 

C++ 11 to_string輸出是:56

std::cout << "std::to_string: " << std::to_string(c) << std::endl; 
+0

爲什麼不指定版本號而不是將其稱爲「增強新庫」? –

+0

是的,我測試了1.49,它打印8 – billz

+0

1.49幾乎不是「新」(2012年2月) –

回答

3

舊的升壓版本不正確。

lexical_cast的結果應該與流式傳輸到一個ostream相同。這樣的

std::cout << boost::lexical_cast<std::string>(x) 

結果是相同的

std::cout << x 

unsigned char這意味着解釋x作爲一個ASCII代碼的情況下,對其他整數類型,它會給相同的結果itoa。這是因爲類型不被ostream視爲算術整數(請參閱第27.3.6.2節和第27.3.6.4節)。這種方法的優點是你可以通過輸出一個字符串來輸出一個字符串。如果你想要實際的數值,你總是可以將char轉換爲算術類型來輸出。

to_string另一方面對所有整數數據類型的工作方式類似itoa,因爲它沒有unsigned char的重載。這裏的基本原理是,通過致電to_string,您已表達您的意圖進行轉換,即你對這個值的字符類型質量(這將是默認值)而不是算術類型質量感興趣。

5

兩者都是正確的。 to_string不在意cchar類型,它會讀取它中的數字並將其轉換爲字符串。

另一方面,lexical_cast<std::string>似乎將char類型的變量解釋爲ascii值。 56是ascii的值8.

8

std::to_string僅爲數值類型提供重載,在這種情況下可能會解析爲unsigned版本。 lexical_cast,OTOH依靠std::ostream::operator<<來執行轉換,因此將c視爲字符。

+0

是的,我花了一段時間才發現'std :: to_string'與boost :: to_string無關'或'boost :: lexical_cast'。 – alfC

2

這是一個解釋的問題。如果您將char解釋爲小整數,則在當前字符集中打印其代碼;這就是to_string似乎在做的事情。

如果您將其解釋爲要打印的字符,則會發出相應的字符,即8,如boost::lexical_cast所做的那樣。

1

這不是char的字符串,它是字符串的「unsigned char」。他們都是正確的。 lexical_cast使用stringstream實例轉換,而std :: to_string被重載爲unsigned,這意味着unsigned char被提升爲unsigned int。

相關問題