http://www.boost.org/libs/conversion/lexical_cast.htm
屬於Boost Conversion Library下的一支,很平常的功能,卻有莫大的幫助。
我想很多C++ programmer遇到要把一個字串轉成整數的情況時,還是會不由自主的使用C時代的atoi。但是atoi有一個很嚴重的問題,就是轉換失敗時一律回傳0,這樣就不知道到底真的是0還是轉換失敗了。
C++的IOstream本身就提供了很好用的類別 - stringstream。
stringstream s("12345");
int d;
s >> d;
可以呼叫fail()來測試轉換是否成功,比atoi好了一點,但是卻比較囉唆,為了轉換一個字串還要在stack裡多產生一個stringstream的object,讓人有點擔心效率。於是,Boost lexical_cast就誕生了:
int d = boost::lexical_cast<int>("12345");
很簡潔的寫法,轉換錯誤的話會丟出bad_lexical_cast這個exception。
那整數要轉成string呢?古早時代有人會用itoa這種非標準的函式來做,現在大部分的programmer可能都懂得要用sprintf這個比較general的function來做:
char s[32];
int d = 12345;
sprintf(s, "%d", d);
而lexical_cast的作法還是一樣:
int d = 12345;
string s = boost::lexical_cast<string>(d);
所以,把atoi丟掉吧,C++時代不用再遷就C的老舊函式了。
2007年8月9日 星期四
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言