欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

boost字符串處理函數(shù)format的用法

 更新時(shí)間:2022年06月18日 16:04:28   作者:天方  
這篇文章介紹了boost字符串處理函數(shù)format的用法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

用boost::format來格式化字符串

在字符串處理中少不了格式化字符串,C++中傳統(tǒng)的格式化函數(shù)是C語言的sprintf,但它一個(gè)很大的問題就是不安全。因此,在stl中引入了stringstream來實(shí)現(xiàn)安全格式化,但是stringstream卻遠(yuǎn)不如sprintf來得直觀。例如,對(duì)如如下代碼:

    char text[]="hello";    
    bool is_all_lower = boost::algorithm::all(text, is_lower());

    char output[128];
    sprintf(output, "<%s> %s in the lower case", text, (is_all_lower? "is": "is not"));

如果把最后兩句format的函數(shù)用stringstream來寫的話,可讀性是遠(yuǎn)不如sprintf的。

    stringstream output;
    output << "<" << text << "> "
        << (is_all_lower)? "is": "is not") 
        << " in the lower case";

boost引入了一個(gè)提供類似.net中的string.format的方式提供格式化字符串的函數(shù),用它來格式化的話就是如下形式:

    boost::format fmt = boost::format("<%s> %s in the lower case") % text % (is_all_lower? "is": "is not");
    string output = fmt.str();

前面的例子中演示的是C風(fēng)格的格式化字符串,boost.format也提供了類似.net風(fēng)格的格式化字符串方式:

    boost::format fmt = boost::format("<%1%> %2% in the lower case") % text % (is_all_lower? "is": "is not");
    cout << fmt << endl;

這種方式更容易看到參數(shù)在格式化字符串中的位置,推薦這種形式。不過它的起始坐標(biāo)是1而不是0,用慣了.net的string.format的朋友需要注意下。

格式化控制

格式化語法為: [ N$ ] [ flags ] [ width ] [ . precision ] type-char。也提供了C語言和.net兩種風(fēng)格。

    //傳統(tǒng)c語言風(fēng)格
    cout << boost::format("\n\n%s" 
            "%1t 十進(jìn)制 = [%d]\n" 
            "%1t 格式化的十進(jìn)制 = [%5d]\n" 
            "%1t 格式化十進(jìn)制,前補(bǔ)'0' = [%05d]\n" 
            "%1t 十六進(jìn)制 = [%x]\n" 
            "%1t 八進(jìn)制 = [%o]\n" 
            "%1t 浮點(diǎn) = [%f]\n" 
            "%1t 格式化的浮點(diǎn) = [%3.3f]\n" 
            "%1t 科學(xué)計(jì)數(shù) = [%e]\n" 
            ) % "example :\n" % 15 % 15 % 15 % 15 % 15 % 15.01 % 15.01 % 15.01 << endl; 

    //.net的風(fēng)格
    cout << boost::format("%1%" 
            "%1t 十進(jìn)制 = [%2$d]\n" 
            "%1t 格式化的十進(jìn)制 = [%2$5d]\n" 
            "%1t 格式化十進(jìn)制,前補(bǔ)'0' = [%2$05d]\n" 
            "%1t 十六進(jìn)制 = [%2$x]\n" 
            "%1t 八進(jìn)制 = [%2$o]\n" 
            "%1t 浮點(diǎn) = [%3$f]\n" 
            "%1t 格式化的浮點(diǎn) = [%3$3.3f]\n" 
            "%1t 科學(xué)計(jì)數(shù) = [%3$e]\n" 
            ) % "example :\n" % 15 % 15.01 << endl;

異常處理

既然boost.format函數(shù)是用來代替sprintf的,那么自然就得有異常處理的功能,而不是像sprintf那樣死給你看。boost.format的處理方法是拋異常,它在如下兩種情況家會(huì)拋異常:

  • format字符串非法

  • format綁定非法

如下代碼演示了這兩種情形:

    try
    {
        boost::format("<%3");
    }
    catch(std::exception& err)
    {
        cout << err.what() << endl;
    }

    boost::format fmt = boost::format("<%3%> %2% in the lower case") % text % (is_all_lower? "is": "is not");
    try
    {
        cout << fmt << endl;
    }
    catch(std::exception& err)
    {
        cout << err.what() << endl;
    }

封裝

boost.format是以一個(gè)對(duì)象,而不是函數(shù)來實(shí)現(xiàn)的,導(dǎo)致其使用和異常處理起來要麻煩不少,不過,利用c++11的可變參數(shù)模板的語法還是可以很容易把它封裝成一個(gè)可變參數(shù)的函數(shù)的形式:

string string_fromat(const char* format, …)

需要定義三個(gè)重載版本:

    template<class TFirst>
    void string_format(boost::format& fmt, TFirst&& first)
    {
        fmt % first;
    }

    template<class TFirst, class... TOther>
    void string_format(boost::format& fmt, TFirst&& first, TOther&&... other)
    {
        fmt % first;
        string_format(fmt, other...);
    }

    template<class TFirst, class... TOther>
    string string_format(const char* format, TFirst&& first, TOther&&... other)
    {
        boost::format fmt(format);
        string_format(fmt, first, other...);
        return fmt.str();
    }

現(xiàn)在就可以這么用了:

auto?output = string_format("<%1%> %2% in the lower case", text, (is_all_lower??"is":?"is not"));

所有的異常也都會(huì)在該函數(shù)中拋出,雖然效率上相對(duì)低點(diǎn),但用起來要舒服點(diǎn)。

到此這篇關(guān)于boost字符串處理函數(shù)format的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++線性表深度解析之動(dòng)態(tài)數(shù)組與單鏈表和棧及隊(duì)列的實(shí)現(xiàn)

    C++線性表深度解析之動(dòng)態(tài)數(shù)組與單鏈表和棧及隊(duì)列的實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)動(dòng)態(tài)數(shù)組、單鏈表、棧、隊(duì)列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C++ explicit關(guān)鍵字的使用詳解

    C++ explicit關(guān)鍵字的使用詳解

    這篇文章主要介紹了C++ explicit關(guān)鍵字的使用詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • C++通過自定義函數(shù)找出一個(gè)整數(shù)數(shù)組中第二大數(shù)的方法

    C++通過自定義函數(shù)找出一個(gè)整數(shù)數(shù)組中第二大數(shù)的方法

    這篇文章主要介紹了C++通過自定義函數(shù)找出一個(gè)整數(shù)數(shù)組中第二大數(shù)的方法,涉及C++針對(duì)數(shù)組的遍歷操作相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • C++性能剖析教程之循環(huán)展開

    C++性能剖析教程之循環(huán)展開

    這篇文章主要給大家介紹了關(guān)于C++性能剖析教程之循環(huán)展開的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06
  • VS2019 更新MSDN并創(chuàng)建快捷方式的實(shí)現(xiàn)

    VS2019 更新MSDN并創(chuàng)建快捷方式的實(shí)現(xiàn)

    這篇文章主要介紹了VS2019 更新MSDN并創(chuàng)建快捷方式的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • 深入解析C++和JAVA的字符串

    深入解析C++和JAVA的字符串

    這篇文章主要介紹了C++和JAVA的字符串,JAVA 中String 和StringBuffer的區(qū)別,需要的朋友可以參考下
    2015-07-07
  • C語言教程之?dāng)?shù)組詳解

    C語言教程之?dāng)?shù)組詳解

    這篇文章主要為大家介紹了C語言教程之?dāng)?shù)組,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C++存儲(chǔ)鏈接性原理詳解

    C++存儲(chǔ)鏈接性原理詳解

    這篇文章主要為大家介紹了C++存儲(chǔ)鏈接性原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 基于C中一個(gè)行壓縮圖的簡(jiǎn)單實(shí)現(xiàn)代碼

    基于C中一個(gè)行壓縮圖的簡(jiǎn)單實(shí)現(xiàn)代碼

    首先簡(jiǎn)單說一下什么是行壓縮圖,其實(shí)嚴(yán)格意義上應(yīng)該是行壓縮矩陣
    2013-05-05
  • 關(guān)于C++中數(shù)據(jù)16進(jìn)制輸出的方法

    關(guān)于C++中數(shù)據(jù)16進(jìn)制輸出的方法

    本文主要介紹了關(guān)于C++中數(shù)據(jù)16進(jìn)制輸出的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03

最新評(píng)論