編寫乙個stl 中的cstring類
來自:計算機世界stl英文是standard template library,也就是我們常說的c++標準模板庫,。該標準庫於2023年被正式納入c++標準,給全世界的c++程式設計師帶來了福音。最讓我們興奮的應該是它的跨平台性,使得你在window,unix ,linux等作業系統上面用標準c++編寫的程式不用修改即可移植。(當然要有c++的編譯器)。
現在的編譯器雖然對標準c++支援程度不同,單總體上還是很好。windows平台的vc ,bc,linux/unix平台的g++都是一流的編譯器,都支援stl。而且stl是有源**的,你可以擴充套件增加,避開這些微小的不同。
說到stl首先要說的當然是字串處理類std::string,這可能是乙個程式設計師使用最多的乙個類,它的功能強大,使用非常方便。但習慣於用vc的cstring開發的程式設計人員會感到有點不方便。幸運的是這個不方便可以很容易的解決,方法就是對標準的字串類std::string進行包裝,生成乙個類似cstring的類,我把它命名為xstring。
下面就從format函式說起,這可能是大部分人最希望用到的:
本函式是乙個變參函式,對引數不定的函式其各式如下:
int format(const char* pstrformat, ... )
其中pstrformat是格式串,三個點代表所有的引數。格式中的每個格式和後面的引數必須相對應,否則函式的執行會出現意想不到的結果;當然過多的引數將被忽略。格式分為簡單字元和轉換規範字元兩類。具體格式規範有如下格式:
%[flags] [width] [.precision] type
flags是標誌字元,輸出對齊,尾零,數值符號,進製數(八或十六)
width是寬度規範符,填補空格或0的個數
precision是精度規範符,列印字元最多個數,對於整數值,為最少數字個數
h短整型數的輸出
i長整型數的輸出
i64為64位的整型輸出
如果你對格式還不清楚,請參考有關printf的格式資料。
對不定引數的處理也很特殊,要使用下面的幾個函式
先宣告乙個變數va_list arglist;
va_start(arglist,pstrformat);
int **t =vsprintf(buff, pstrformat, arglist);
va_end(arglist);
這樣就把格式化後的結果儲存在buff字串中了。
然後最重要的就是計算這個buff有多大,如果大了就有記憶體浪費,小了完不成任務,所以要根據格式來動態計算,然後動態的開闢記憶體空間。就用乙個迴圈來把格式串中的每乙個字元讀出來分別處理。先初始化乙個長度變數nmaxlen =0;
for (const char * p = pstrformat; *p != 』0』;p++ )
如果讀出來的不是』%』或是『%%』則長度加一。
if (*p != 』%』 || *(++p) == 』%』)
如果前乙個字元是『%』,則讀取格式,如果是『#』則長度加2,來為『0x』預留空間;如果是『*』,則讀緊跟著的乙個整數,得到指定的寬度;其他的『+』、『-』、『 』、『0』等字元主要是填充用,忽略長度。
for (; *p != 』0』; p ++)
如果下乙個字元是『.』則忽略去讀取其後面乙個字元,如果是『*』則也要讀出其後的寬度,來計算精度。
if (*p == 』*』)
else
接下來處理字元如果是『h』、『l』、『i』、『f』、『n』等,則忽略計算長度。
如果讀取字元是『c』、『c』則長度加上2(考慮寬字元的情況);如果讀取的是『s』、『s』則要計算引數中給的字串的寬度。
switch (*p)
如果讀出的字元是『d』、『i』、『u』、『x』、『o』,『e』、『f』、『g』、『g』等,則長度加上對應的數值型的長度,當然最好使用sizeof計算,使得具有更好的移植能力。
case 』d』:
case 』i』:
case 』u』:
case 』x』:
case 』x』:
case 』o』:
va_arg(arglist, int);
nitemlen = 32;
在for迴圈體的最後當然不要忘了把長度累計nmaxlen += nitemlen;當迴圈結束時,長度的計算也就完成了。
for迴圈結束時呼叫va_end(arglist);
下面就可以開闢恰當的記憶體空間,來儲存你的格式串。
char* ch = new char[nmaxlen+1];
有了空間再重新接收引數就可以了。
va_start(arglist, pstrformat);
vsprintf(ch, pstrformat, arglist);
va_end(arglist);
然後釋放你的記憶體空間
delete ch;
其他的函式可以用std::string中的相對應的功能包裝即可,下面就再寫乙個makeupper函式,它也是cstring中的。
void makeupper()
是不是很容易呢,希望本文能起到拋磚引玉的作用,給你使用stl帶來方便。
以上的程式編碼在vc和g++中均可使用。本人曾用xstring 類替代了乙個用mfc編寫的專案中的所有的cstring類 ,使得它順利的用g++編譯通過。
編寫乙個makefile
什麼是makefile?對於大多數的windows程式設計師來講,makefile可能不是那麼重要,因為windows的ide都為程式設計師做好了這個工作。但是在linux下程式設計,會不會寫makefile,從側面上說明乙個人是否具備完成大型工程的能力。makefile的作用 makefile是用...
編寫乙個webpack loader
loader是一種打包的方案,webpack預設只識別js結尾的檔案,當遇到其他格式的檔案後,webpack並不知道如何去處理。此時,我們可以定義一種規則,告訴webpack當他遇到某種格式的檔案後,去求助於相應的loader。新建loaders資料夾並建立三個loaders檔案 remove co...
乙個通用Makefile的編寫
我們在linux環境下開發程式,少不了要自己編寫makefile,乙個稍微大一些的工程下面都會包含很多.c的原始檔。如果我們用gcc去乙個乙個編譯每乙個原始檔的話,效率會低很多,但是如果我們可以寫乙個makefile,那麼只需要執行乙個make就ok了,這樣大大提高了開發效率。但是makefile的...