編寫乙個STL 中的CString類

2021-03-31 08:56:29 字數 2675 閱讀 7543

編寫乙個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的...