談新手對CString的使用

2021-03-31 08:56:58 字數 2375 閱讀 2356

cstring類功能強大,比stl的string類有過之無不及.新手使用cstring時,都會被它強大

的功能所吸引.然而由於對它內部機制的不了解,新手在將cstring向c的字元陣列轉換時

容易出現很多問題.因為cstring已經過載了lpctstr運算子,所以cstring類向const

char *轉換時沒有什麼麻煩,如下所示:

char a[100];

cstring str("aaaaaa");

strncpy(a,(lpctstr)str,sizeof(a));

或者如下:

strncpy(a,str,sizeof(a));

以上兩種用法都是正確地.因為strncpy的第二個引數型別為const char *.所以編譯器

會自動將cstring類轉換成const char *.很多人對lpctstr是什麼東西迷惑不解,讓我們

來看看:

1.lp表示長指標,在win16下有長指標(lp)和短指標(p)的區別,而在win32下是沒有區別

的,都是32位.所以這裡的lp和p是等價的.

2.c表示const

3.t是什麼東西呢,我們知道tchar在採用unicode方式編譯時是wchar_t,在普通時編譯成char

那麼就可以看出lpctstr(pctstr)在uincode時是const wchar_t *,pcwstr,lpcwstr,在

多位元組字元模式時是const char *,pcstr,lpcstr.

接下來我們看在非unicode情況下,怎樣將cstring轉換成char *,很多初學者都為了方便

採用如下方法:

(char *)(lpcstr)str.這樣對嗎?我們首先來看乙個例子:

cstring str("aa");

strcpy((char *)(lpctstr)str,"aaaaaaaa");

cout<<(lpctstr)str<在debug下執行出現了異常,我們都知道cstring類內部有自己的字元指標,指向乙個已分

配的字元緩衝區.如果往裡面寫的字元數超出了緩衝區範圍,當然會出現異常.但這個程

序在release版本下不會出現問題.原來對cstring類已經進行了優化.當需要分配的記憶體

小於64位元組時,直接分配64位元組的記憶體,以此類推,一般cstring類字元緩衝區的大小為

64,128,256,512...這樣是為了減少記憶體分配的次數,提高速度.

那有人就說我往裡面寫的字元數不超過它原來的字元數,不就不會出錯了,比如

cstring str("aaaaaaa");

strcpy((char *)(lpctstr)str,"aa");

cout<<(lpctstr)str<這樣看起來是沒什麼問題.我們再來看下面這個例子:

cstring str("aaaaaaa");

strcpy((char *)(lpctstr)str,"aa");

cout<<(lpctstr)str<我們看到str的長度沒有隨之改變,繼續為7而不是2.還有更嚴重的問題:

cstring str("aaaaaaa");

cstring str1 = str;

strcpy((char *)(lpctstr)str,"aa");

cout<<(lpctstr)str<按說我們只改變了str,str1應該沒有改變呀,可是事實時他們都變成了"aa".難道str和

str1裡面的字元指標指向的緩衝區是乙個.我們在effective c++裡面得知,如果你的類

內部有包含指標,請為你的類寫乙個拷貝建構函式和賦值運算子.不要讓兩個物件內部的

指標指向同一區域,而應該重新分配記憶體.難道是微軟犯了錯?

原來這裡還有乙個"寫時複製"和"引用計數"的概念.cstring類的用途很廣,這樣有可能

在系統內部產生大量的cstring臨時物件.這時為了優化效率,就採用在系統軟體內部廣

泛使用的"寫時複製"概念.即當從乙個cstring產生另乙個cstring並不複製它的字元緩

沖區內容,而只是將字元緩衝區的"引用計數"加1.當需要改寫字元緩衝區內的內容時,才

分配記憶體,並複製內容.以後我會給出乙個"寫時複製"和"引用計數"的例子

我們回到主題上來,當我們需要將cstring轉換成char *時,我們應該怎麼做呢?其時只是

麻煩一點,如下所示:

cstring str("aaaaaaa");

strcpy(str.getbuffer(10),"aa");

str.releasebuffer();

當我們需要字元陣列時呼叫getbuffer(int n),其中n為我們需要的字元陣列的長度.使

用完成後一定要馬上呼叫releasebuffer();

還有很重要的一點就是,在能使用const char *的地方,就不要使用char *

C string類的使用

1.為什麼要選擇string類 記憶體不受限,有沒有在oj為了輸入資料的字串的長度不可知而痛苦萬分,有了string類,所有都交給他來幫你完成吧,暫時也就可以忽略記憶體管理這件 的事情了。豐富的操作符,這一點有點類似與python這樣的指令碼語言的中的str,用起來比較的得心應手,要是再有個分割sp...

C string的簡單使用

string是字串,c 相對c來說增加了這個,比字元陣列方便很多。有插入,替換,刪除,反序,比較等功能。接下來用乙個程式將大部分功能串再一起,並在下方鏈結一些應用string解題的鏈結。author frankyu date 2018 1 30 string include includeusing...

在C String的使用

1.c 中 字串常量可以以 開頭聲名,這樣的優點是轉義序列 不 被處理,按 原樣 輸出,即我們不需要對轉義字元加上 反斜扛 就可以輕鬆coding。如 string filepath c docssourcea.txt rather than c docssourcea.txt 2.如要在乙個用 引...