青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
數(shù)據(jù)加載中……

對(duì)字符串類型和數(shù)值類型間進(jìn)行轉(zhuǎn)換問題的處理之Boost組件lexical_cast

在CSDN論壇上經(jīng)??吹皆儐柸绾卧谧址愋秃蛿?shù)值類型間進(jìn)行轉(zhuǎn)換的問題,也看到了許多不同的答案。下面先討論一下從字符串類型到數(shù)值類型的轉(zhuǎn)換。

  1. 如何將字符串"123"轉(zhuǎn)換為int類型整數(shù)123?答案是,用標(biāo)準(zhǔn)C的庫函數(shù)atoi;
  2. 如果要轉(zhuǎn)換為long類型呢?標(biāo)準(zhǔn)C的庫函數(shù)atol;
  3. 如何將"123.12"轉(zhuǎn)換為double類型呢?標(biāo)準(zhǔn)C的庫函數(shù)atod;
  4. 如果要轉(zhuǎn)換為long double類型呢?標(biāo)準(zhǔn)C的庫函數(shù)atold;
  5. ……

后來有朋友開始使用標(biāo)準(zhǔn)庫中的string類,問這個(gè)如何轉(zhuǎn)換為數(shù)值?有朋友答曰,請(qǐng)先轉(zhuǎn)換為const char*。我很佩服作答者有數(shù)學(xué)家的思維:把陌生的問題轉(zhuǎn)化成熟悉的問題。(曾經(jīng)有一則笑話,好事者問數(shù)學(xué)家:知道如何燒水嗎?答:知道。把水壺加滿水,點(diǎn)火燒。又問:如果水壺里已經(jīng)有水了呢?答:先倒掉,就轉(zhuǎn)化為我熟悉的問題了……)

不,不,這樣是C的做法,不是C++。那么,C++該怎么做呢?使用Boost Conversion Library所提供的函數(shù)lexical_cast(需要引入頭文件boost/lexical_cast.hpp)無疑是最簡單方便的。如:

#include <boost/lexical_cast.hpp>
#include <iostream>
int main()
{
        using boost::lexical_cast;
        int a = lexical_cast<int>("123");
        double b = lexical_cast<double>("123.12");
        std::cout<<a<<std::endl
        std::cout<<b<<std::endl;
        return 0;
}

一個(gè)函數(shù)就簡潔地解決了所有的問題。

3.2 數(shù)值→字符串

那么從數(shù)值類型到字符串類型呢?

用itoa?不對(duì)吧,標(biāo)準(zhǔn)C/C++里根本沒有這個(gè)函數(shù)。即使在Windows平臺(tái)下某些編譯器提供了該函數(shù)3,沒有任何移植性不說,還只能解決int類型(也許其他函數(shù)還可以解決long、unsigned long等類型),浮點(diǎn)類型又怎么辦?當(dāng)然,辦法還是有,那就是:sprintf。

char s[100];
sprintf(s, "%f", 123.123456);

不知道諸位對(duì)C里的scanf/printf系列印象如何,總之阿炯我肯定記不住那些稀奇古怪的參數(shù),而且如果寫錯(cuò)了參數(shù),就會(huì)得到莫名其妙的輸出結(jié)果,調(diào)試起來可就要命了(我更討厭的是字符數(shù)組,空間開100呢,又怕太小裝不下;開100000呢,總覺得太浪費(fèi),心里憋氣,好在C++標(biāo)準(zhǔn)為我們提供了string這樣的字符串類)。這時(shí)候,lexical_cast就出來幫忙啦。

#include <boost/lexical_cast.hpp>
#include <string>
#include <iostream>
int main()
{
        using std::string;
        const double d = 123.12;
        string s = boost::lexical_cast<string>(d);
        std::cout<<s<<std::endl;
        return 0;
}

跟前面一樣簡單。

3.3 異常

如果轉(zhuǎn)換失敗,則會(huì)有異常bad_lexical_cast拋出。該異常類是標(biāo)準(zhǔn)異常類bad_cast的子類。

#include <boost/lexical_cast.hpp>
#include <iostream>
int main()
{
        using std::cout;
        using std::endl;
        int i;
        try{
                i = boost::lexical_cast<int>("abcd");
        }
        catch(boost::bad_lexical_cast& e)
        {
                cout<<e.what()<<endl;
                return 1;
        }
        cout<<i<<endl;
        return 0;
}

顯然“abcd”并不能轉(zhuǎn)換為一個(gè)int類型的數(shù)值,于是拋出異常,捕捉后輸出“bad lexical cast: source type value could not be interpreted as target”這樣的信息。

3.4 注意事項(xiàng)

lexical_cast依賴于字符流std::stringstream(會(huì)自動(dòng)引入頭文件4),其原理相當(dāng)簡單:把源類型讀入到字符流中,再寫到目標(biāo)類型中,就大功告成。例如

int d = boost::lexical_cast<int>("123");

就相當(dāng)于

int d;
std::stringstream s;
s<<"123";
s>>d;

既然是使用了字符流,當(dāng)然就有些隨之而來的問題,需要特別指出5。

  • 由于Visual C++ 6的本地化(locale)部分實(shí)現(xiàn)有問題,因此如果使用了非默認(rèn)的locale,可能會(huì)莫名其妙地拋出異常。當(dāng)然,一般情況下我們并不需要去改變默認(rèn)的locale,所以問題不是很大。
  • 輸入數(shù)據(jù)必須“完整”地轉(zhuǎn)換,否則拋出bad_lexical_cast異常。例如
int i = boost::lexical_cast<int>("123.123"); // this will throw 

便會(huì)拋出異常。因?yàn)椤?23.123”只能“部分”地轉(zhuǎn)換為123,不能“完整”地轉(zhuǎn)換為123.123。

  • 浮點(diǎn)數(shù)的精度問題。
std::string s = boost::lexical_cast<std::string>(123.1234567);

以上語句預(yù)想的結(jié)果是得到“123.1234567”,但是實(shí)際上我們只會(huì)得到“123.123”,因?yàn)槟J(rèn)情況下std::stringstream的精度是6(這是C語言程序庫中的“前輩”printf留下的傳統(tǒng))。這可以說是boost::lexical_cast的一個(gè)bug。怎么辦呢?權(quán)宜之計(jì),可以這么做:打開頭文件<boost/lexical_cast.hpp>,注意對(duì)照修改6

#include <boost/limits.hpp>
//...
template<typename Target, typename Source>
Target lexical_cast(Source arg) {
        //...
        Target result; 
        interpreter.precision(std::numeric_limits<Source>::digits10);
        if( !(interpreter << arg) ||
        !(interpreter >> result) ||
        !(interpreter >> std::ws).eof())
        //...
}

即可得到正確結(jié)果。當(dāng)然,理論上效率會(huì)有一點(diǎn)點(diǎn)損失,不過幾乎可以忽略不計(jì)。

4 小結(jié)

我們已經(jīng)體驗(yàn)了boost::lexcial_cast。當(dāng)然,lexical_cast不僅僅局限于字符串類型與數(shù)值類型之間的轉(zhuǎn)換:可在任意可輸出到stringstream的類型和任意可從stringstream輸入的類型間轉(zhuǎn)換。這次的了解盡管很粗略,不過畢竟我們已經(jīng)“走進(jìn)Boost”,而不僅僅是“走近”。以后,我們可以自行領(lǐng)略Boost的動(dòng)人之處啦。

posted on 2008-04-25 17:08 肥仔 閱讀(663) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Boost & STL

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美韩国日本综合| 伊人成年综合电影网| 欧美一级理论片| 亚洲自拍偷拍视频| 日韩视频在线播放| 99re66热这里只有精品4| 一本大道久久精品懂色aⅴ| 亚洲作爱视频| 欧美在线影院在线视频| 免费一区视频| 欧美三日本三级少妇三99 | 久久爱91午夜羞羞| 欧美一区中文字幕| 麻豆成人小视频| 欧美精品尤物在线| 国产日韩欧美黄色| 亚洲激情一区二区| 亚洲午夜视频在线观看| 久久久不卡网国产精品一区| 欧美成人一区二区三区片免费| 欧美成人性生活| 在线亚洲免费| 久久欧美中文字幕| 国产精品久久久久久久app | 日韩小视频在线观看专区| 亚洲一区二区在线观看视频| 久久女同互慰一区二区三区| 欧美激情一区二区三区不卡| 亚洲免费在线视频| 欧美激情久久久| 国产精品一级| 亚洲国产精品综合| 久久婷婷影院| 亚洲综合色丁香婷婷六月图片| 久久人人爽爽爽人久久久| 国产精品久久网站| 亚洲精品免费在线播放| 久久久久久噜噜噜久久久精品| 亚洲精品系列| 久久先锋资源| 国产一区香蕉久久| 亚洲欧美日韩综合国产aⅴ| 欧美国产亚洲精品久久久8v| 亚洲欧美视频一区二区三区| 欧美日韩精品免费在线观看视频| 在线观看欧美日韩| 欧美1级日本1级| 亚洲国产二区| 香蕉久久久久久久av网站| 亚洲激情视频| 久久xxxx| 国产无一区二区| 欧美亚洲视频一区二区| 一区二区三区国产在线| 欧美高清在线一区二区| 亚洲国产精品一区制服丝袜| 另类天堂视频在线观看| 久久精品五月| 精品99一区二区| 久久天天躁狠狠躁夜夜爽蜜月| 午夜精品国产| 国产一区二区三区高清| 久久精品色图| 久久尤物电影视频在线观看| 亚洲国产精品t66y| 91久久综合| 欧美午夜精品理论片a级按摩 | 欧美一区二区三区免费观看| 国产精品久久久久久久久久久久 | 一本色道久久综合亚洲91| 亚洲国内在线| 欧美日韩国产限制| 亚洲一级黄色av| 一区二区三欧美| 国产精品www994| 欧美一区二区三区婷婷月色| 欧美一区二区三区免费观看| 国产一区二区三区久久久久久久久| 久久免费精品日本久久中文字幕| 欧美影院一区| 亚洲激情自拍| 夜夜嗨av一区二区三区四季av| 国产精品国产三级国产普通话三级 | 欧美国产日本高清在线| 欧美成人xxx| 亚洲视频一区| 久久精品成人| 99re8这里有精品热视频免费 | 在线观看中文字幕亚洲| 久久久久久久久伊人| 免费高清在线一区| 中文一区二区| 久久精品一本| 最新成人av网站| 亚洲精品无人区| 欧美美女操人视频| 亚洲欧美中文在线视频| 亚洲国产精品电影| 国产一区二区三区精品欧美日韩一区二区三区 | 国产一区二区三区久久久| 亚洲国产91色在线| 亚洲视频一二三| 在线成人小视频| 欧美aⅴ99久久黑人专区| 男男成人高潮片免费网站| 欧美色综合网| 在线亚洲激情| 亚洲一区二区av电影| 韩日视频一区| 亚洲欧美一区二区视频| 中文av一区二区| 欧美精品性视频| 亚洲国产欧美日韩精品| 国产一区二区三区自拍| 最近看过的日韩成人| 亚洲国产老妈| 亚洲一区二区三区免费视频| 国产精品theporn88| 亚洲欧美成人网| 国产日产亚洲精品系列| 亚洲综合清纯丝袜自拍| 欧美电影打屁股sp| 亚洲片国产一区一级在线观看| 欧美大秀在线观看| 欧美午夜免费影院| 一区二区三区日韩欧美| 欧美国产精品久久| 一区二区高清视频| 国产伦一区二区三区色一情| 欧美一级大片在线观看| 中日韩美女免费视频网站在线观看| 欧美日本簧片| 一区二区三区四区五区在线| 日韩网站免费观看| 欧美日韩精品在线观看| 女人香蕉久久**毛片精品| 中文日韩电影网站| 亚洲日本免费电影| 欧美无砖砖区免费| 欧美在线亚洲在线| 欧美激情精品久久久久久黑人| 一区二区三欧美| 亚洲黄页视频免费观看| 国产精品乱子久久久久| 欧美 日韩 国产精品免费观看| 在线中文字幕不卡| 国产真实久久| 国产在线拍揄自揄视频不卡99| 久久av一区二区三区亚洲| 麻豆国产精品一区二区三区 | 亚洲高清不卡在线观看| 久久国产黑丝| 久久九九精品| 美女在线一区二区| 亚洲欧美影院| 午夜精品福利电影| 欧美在线欧美在线| 欧美va天堂| 韩国三级电影一区二区| 国产午夜精品一区二区三区视频| 欧美丰满高潮xxxx喷水动漫| 亚洲欧美在线看| 欧美成人按摩| 一区二区三区av| 欧美韩国日本一区| 欧美金8天国| 亚洲自拍偷拍视频| 欧美一区二区三区四区夜夜大片| 国产精品中文字幕欧美| 久久成人免费日本黄色| 久久国产精品72免费观看| 激情欧美丁香| 亚洲国产女人aaa毛片在线| 久久综合九色九九| 欧美在线播放高清精品| 老鸭窝毛片一区二区三区| 99日韩精品| 久久久精品国产一区二区三区| 日韩视频免费观看高清完整版| 亚洲一区二区三区视频| 亚洲精品一区二区三区av| 亚洲欧美日韩精品在线| 一区二区三区国产盗摄| 久久综合激情| 久久激情视频| 国产欧美亚洲一区| 中日韩男男gay无套| 中日韩视频在线观看| 欧美成人69| 欧美日韩国产一中文字不卡| 欧美高清不卡| 亚洲精品之草原avav久久| 另类国产ts人妖高潮视频| 美女网站久久| 18成人免费观看视频| 久久久久久久综合色一本| 免费在线观看日韩欧美| 亚洲视频免费观看| 夜夜嗨av一区二区三区网页 | 1024欧美极品|