轉載地址:http://wtfang.blog.163.com/blog/static/31594808201141111413217/?COLLCC=4192787263
如果你需要修改CString中的內容,它有一個特殊的方法可以使用,那就是GetBuffer,它的作用是返回一個可寫的緩衝指針。如果你打算修改字符或者截短字符串,你完全可以這樣做:
CString s(_T("File.ext"));
LPTSTR p = s.GetBuffer();
LPTSTR dot = strchr(p, '' . '');
if(p != NULL)
*p = _T(''\0'');
s.ReleaseBuffer();
這是 GetBuffer 的第一種用法,也是最簡單的一種,不用給它傳遞參數,它使用默認值 0,意思是:“給我這個字符串的指針,我保證不加長它”。
當你調用 ReleaseBuffer 時,字符串的實際長度會被重新計算,然後存入 CString 對象中。
必須強調一點,在 GetBuffer 和 ReleaseBuffer 之間這個範圍,一定不能使用你要操作的這個緩衝CString 對象的任何方法。因爲 ReleaseBuffer被調用之前,該 CString 對象的完整性得不到保障。研究以下代碼:
CString s(...);
LPTSTR p = s.GetBuffer(); //... 這個指針 p 發生了很多事情
int n = s.GetLength(); // 有可能給出錯誤的答案!!!
s.TrimRight(); // 不能保證能正常工作!!!!
s.ReleaseBuffer(); // 現在應該 OK
int m = s.GetLength(); // 這個結果可以保證是正確的。
s.TrimRight(); // 將正常工作。
假設你想增加字符串的長度,你首先要知道這個字符串可能會有多長,好比是聲明字符串數組的時候用:
char buffer[1024];
表示 1024 個字符空間足以讓你做任何想做得事情。
在 CString 中與之意義相等的表示法:
LPTSTR p = s.GetBuffer(1024);
調用這個函數後,你不僅獲得了字符串緩衝區的指針,而且同時還獲得了長度至少爲 1024 個字符的空間(注意,我說的是“字符”,而不是“字節”,因爲CString是以隱含方式感知Unicode的)。
同時,還應該注意的是,如果你有一個常量串指針,這個串本身的值被存儲在只讀內存中,如果試圖存儲它,即使你已經調用了 GetBuffer ,並獲得一個只讀內存的指針,存入操作會失敗,並報告存取錯誤。