C++將字符串格式化的幾種方式總結(jié)
C++將字符串格式化的幾種方式
具體示例
使用snprintf格式化字符串
#include <stdio.h> using std::string; // 準(zhǔn)備數(shù)據(jù) string haha("haha"); int num = 3; // 準(zhǔn)備格式 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" // 準(zhǔn)備數(shù)據(jù) string haha("haha"); int num = 3; // 準(zhǔn)備格式 boost::format fmt("test string: %s. test number: %d"); // 格式化 fmt % haha % num; // 獲取最終需要的字符串 string targetString = fmt.str();
使用stringstream格式化字符串
#include <sstream> using std::stringstream; // 準(zhǔn)備數(shù)據(jù) string haha("haha"); int num = 3; // 準(zhǔn)備根據(jù)格式造字符串流 stringstream fmt; ? ? ? ? ? ? ? ? ? ? ? /* 或者使用 ostringstream */ // 造字符串流 fmt << "test string: " << haha << ". test number: " << num; // 獲取最終需要的字符串 string targetString = fmt.str();
C++11的一個(gè)格式化字符串的黑科技
有時(shí)候我們需要按照某種格式寫(xiě)文件,比如我們做一個(gè)代碼自動(dòng)生成工具,要在源代碼中寫(xiě)入一個(gè)函數(shù),為了保證自動(dòng)生成的代碼文件的可讀性,需要將縮進(jìn)格式也寫(xiě)入到文件,如下面的代碼
int func() { ?? ?int i, sum; ?? ?for(i = 0, sum = 0; i < 100; ++i) ?? ?{ ?? ??? ?sum += i; ?? ?} ?? ?return sum; }
如果我們?cè)诖a中這樣寫(xiě)
char *p = "int func()\ {\ ?? ?int i, sum;\ ?? ?for(i = 0, sum = 0; i < 100; ++i)\ ?? ?{\ ?? ??? ?sum += i;\ ?? ?}\ ?? ?return sum;\ }";
將字符串p寫(xiě)入文件后,結(jié)果是字符串全都寫(xiě)在一行里,格式完全丟失,為了保證格式,需要加入一些\t\n等轉(zhuǎn)義字符來(lái)控制格式
char *p = "int func()\n\ {\n\ ?? ?\tint i, sum;\n\ ?? ?\tfor(i = 0, sum = 0; i < 100; ++i)\n\ ?? ?\t{\n\ ?? ??? ?\t\tsum += i;\n\ ?? ?\t}\n\ ?? ?\treturn sum;\n\ }";
這樣字符串p就能在保存格式的情況下寫(xiě)入文件。
這樣雖然能解決問(wèn)題,但很麻煩,而且容易出錯(cuò),幸好在C艸11中給了一個(gè)格式化的字符串定義方法,就是在引號(hào)前面加一個(gè)大寫(xiě)的R,在引號(hào)后面加個(gè)括號(hào),如下所示
char *p = R"( int func() { ?? ?int i, sum; ?? ?for(i = 0, sum = 0; i < 100; ++i) ?? ?{ ?? ??? ?sum += i; ?? ?} ?? ?return sum; } )";
這樣指針p中就保留了字符串格式,直接將我們鍵盤(pán)輸入的tab寫(xiě)成了\t,括號(hào)內(nèi)的字符串是什么格式,寫(xiě)入文件里就是什么格式。
如果我們的字符串里有引號(hào)加括號(hào)"(或)"的形式,我們可以在引號(hào)和括號(hào)中間隨便加個(gè)什么字符串用以區(qū)分,但要前后一致,如下所示
char *p = R"1234( //這樣字符串里就可以有)"和"(這樣的字符了,這里的1234是隨便寫(xiě)的,寫(xiě)什么都行,但要前后一致 int func() { ?? ?int i, sum; ?? ?for(i = 0, sum = 0; i < 100; ++i) ?? ?{ ?? ??? ?sum += i; ?? ?} ?? ?return sum; } )1234";
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++學(xué)習(xí)小結(jié)之?dāng)?shù)據(jù)類(lèi)型及轉(zhuǎn)換方式
本文給大家分享的是本人在學(xué)習(xí)C++過(guò)程中的一個(gè)小心得,關(guān)于數(shù)據(jù)類(lèi)型和轉(zhuǎn)換方式的,這里記錄下來(lái),推薦給菜鳥(niǎo)們,高手大神請(qǐng)直接飄過(guò)。2015-07-07C++入門(mén)概覽和嘗試創(chuàng)建第一個(gè)C++程序
這篇文章主要介紹了C++入門(mén)概覽和嘗試創(chuàng)建第一個(gè)C++程序,同時(shí)也包括編寫(xiě)類(lèi)的示例展示C++面向?qū)ο蟮奶匦?需要的朋友可以參考下2015-09-09C++?STL標(biāo)準(zhǔn)庫(kù)std::vector擴(kuò)容時(shí)進(jìn)行深復(fù)制原因詳解
我們知道,std::vector之所以可以動(dòng)態(tài)擴(kuò)容,同時(shí)還可以保持順序存儲(chǔ),主要取決于其擴(kuò)容復(fù)制的機(jī)制。當(dāng)容量滿(mǎn)時(shí),會(huì)重新劃分一片更大的內(nèi)存區(qū)域,然后將所有的元素拷貝過(guò)去2022-08-08C++中memcpy和memmove的區(qū)別總結(jié)
這篇文章主要介紹了C++中memcpy和memmove的區(qū)別總結(jié),這個(gè)問(wèn)題經(jīng)常出現(xiàn)在C++的面試題目中,需要的朋友可以參考下2014-10-10