首頁 > 軟體

C++將字串格式化的幾種方式總結

2023-10-11 14:00:08

C++將字串格式化的幾種方式

具體範例

使用snprintf格式化字串

#include <stdio.h>
using std::string;
// 準備資料
string haha("haha");
int num = 3;
// 準備格式
string fmt("test string: %s. test number: %d");
char targetString[1024];
// 格式化,並獲取最終需要的字串
int realLen = snprintf( targetString, 
                        sizeof(targetString), 
                        fmt.c_str(), 
                        haha.c_str(), 
                        num );

使用boost::format格式化字串

#include "boost/format.hpp"
// 準備資料
string haha("haha");
int num = 3;
// 準備格式
boost::format fmt("test string: %s. test number: %d");
// 格式化
fmt % haha % num;
// 獲取最終需要的字串
string targetString = fmt.str();

使用stringstream格式化字串

#include <sstream>
using std::stringstream;
// 準備資料
string haha("haha");
int num = 3;
// 準備根據格式造字串流
stringstream fmt;                       /* 或者使用 ostringstream */
// 造字串流
fmt << "test string: " << haha << ". test number: " << num;
// 獲取最終需要的字串
string targetString = fmt.str();

C++11的一個格式化字串的黑科技

有時候我們需要按照某種格式寫檔案,比如我們做一個程式碼自動生成工具,要在原始碼中寫入一個函數,為了保證自動生成的程式碼檔案的可讀性,需要將縮排格式也寫入到檔案,如下面的程式碼

int func()
{
    int i, sum;
    for(i = 0, sum = 0; i < 100; ++i)
    {
        sum += i;
    }
    return sum;
}

如果我們在程式碼中這樣寫

char *p = "int func()
{
    int i, sum;
    for(i = 0, sum = 0; i < 100; ++i)
    {
        sum += i;
    }
    return sum;
}";

將字串p寫入檔案後,結果是字串全都寫在一行裡,格式完全丟失,為了保證格式,需要加入一些tn等跳脫字元來控制格式

char *p = "int func()n
{n
    tint i, sum;n
    tfor(i = 0, sum = 0; i < 100; ++i)n
    t{n
        ttsum += i;n
    t}n
    treturn sum;n
}";

這樣字串p就能在儲存格式的情況下寫入檔案。

這樣雖然能解決問題,但很麻煩,而且容易出錯,幸好在C艹11中給了一個格式化的字串定義方法,就是在引號前面加一個大寫的R,在引號後面加個括號,如下所示

char *p = R"(
int func()
{
    int i, sum;
    for(i = 0, sum = 0; i < 100; ++i)
    {
        sum += i;
    }
    return sum;
}
)";

這樣指標p中就保留了字串格式,直接將我們鍵盤輸入的tab寫成了t,括號內的字串是什麼格式,寫入檔案裡就是什麼格式。

如果我們的字串裡有引號加括號"(或)"的形式,我們可以在引號和括號中間隨便加個什麼字串用以區分,但要前後一致,如下所示

char *p = R"1234(
//這樣字串裡就可以有)"和"(這樣的字元了,這裡的1234是隨便寫的,寫什麼都行,但要前後一致
int func()
{
    int i, sum;
    for(i = 0, sum = 0; i < 100; ++i)
    {
        sum += i;
    }
    return sum;
}
)1234";

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com