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的一個格式化字符串的黑科技
有時候我們需要按照某種格式寫文件,比如我們做一個代碼自動生成工具,要在源代碼中寫入一個函數(shù),為了保證自動生成的代碼文件的可讀性,需要將縮進格式也寫入到文件,如下面的代碼
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寫入文件后,結(jié)果是字符串全都寫在一行里,格式完全丟失,為了保證格式,需要加入一些\t\n等轉(zhuǎn)義字符來控制格式
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就能在保存格式的情況下寫入文件。
這樣雖然能解決問題,但很麻煩,而且容易出錯,幸好在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,括號內(nèi)的字符串是什么格式,寫入文件里就是什么格式。
如果我們的字符串里有引號加括號"(或)"的形式,我們可以在引號和括號中間隨便加個什么字符串用以區(qū)分,但要前后一致,如下所示
char *p = R"1234( //這樣字符串里就可以有)"和"(這樣的字符了,這里的1234是隨便寫的,寫什么都行,但要前后一致 int func() { ?? ?int i, sum; ?? ?for(i = 0, sum = 0; i < 100; ++i) ?? ?{ ?? ??? ?sum += i; ?? ?} ?? ?return sum; } )1234";
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++學(xué)習(xí)小結(jié)之?dāng)?shù)據(jù)類型及轉(zhuǎn)換方式
本文給大家分享的是本人在學(xué)習(xí)C++過程中的一個小心得,關(guān)于數(shù)據(jù)類型和轉(zhuǎn)換方式的,這里記錄下來,推薦給菜鳥們,高手大神請直接飄過。2015-07-07C++?STL標(biāo)準(zhǔn)庫std::vector擴容時進行深復(fù)制原因詳解
我們知道,std::vector之所以可以動態(tài)擴容,同時還可以保持順序存儲,主要取決于其擴容復(fù)制的機制。當(dāng)容量滿時,會重新劃分一片更大的內(nèi)存區(qū)域,然后將所有的元素拷貝過去2022-08-08C++中memcpy和memmove的區(qū)別總結(jié)
這篇文章主要介紹了C++中memcpy和memmove的區(qū)別總結(jié),這個問題經(jīng)常出現(xiàn)在C++的面試題目中,需要的朋友可以參考下2014-10-10