CString物件包含字元字串數據。 CString會繼承類別範本CStringT中定義的方法和運算元集合,以使用字串數據。 (CString 是 typedef 專門 CStringT 用來處理支援的字元資料類型 CString 的 。
CString 不像 C 樣式的 null 終止字串一樣在內部存放字元資料。 相對地,CString 會追蹤字元資料的長度,以便能更安全地監看資料及其所需空間。
CString 會接受 C 樣式字串,且提供以 C 樣式字串來存取字元資料的方式。 本主題包含下列各節,解釋如何使用 CString 物件,就彷彿其為 C 樣式的 null 終止字串。
使用 CString 做為 C 樣式的 Null 終止字串
若要使用 CString 物件做為 C 樣式字串,請將 物件 LPCTSTR轉換成 。 在下列範例中,CString 會傳回唯讀 C 樣式 null 終止字串的指標。 strcpy 函式會將一份 C 樣式字串放在變數 myString。
CString aCString = "A string";
char myString[256];
strcpy(myString, (LPCTSTR)aCString);
您可以使用 CString 方法,例如 SetAt,來修改字串物件中的個別字元。 不過, LPCTSTR 指標是暫時的,當對 進行 CString任何變更時會變成無效。 CString 也可能超出範圍而自動遭刪除。 建議您在每次使用物件時,取得物件的全新 LPCTSTR 指標 CString 。
有時候您可能需要一份 CString 資料以便直接修改。 請使用更安全的函式 strcpy_s (或 Unicode/MBCS 可攜式 _tcscpy_s) 將 CString 物件複製到個別的緩衝區。 在這裡,字元可以安全地修改,如下列範例所示。
CString theString(_T("This is a test"));
int sizeOfString = (theString.GetLength() + 1);
LPTSTR lpsz = new TCHAR[sizeOfString];
_tcscpy_s(lpsz, sizeOfString, theString);
//... modify lpsz as much as you want
注意
的第三個自變數strcpy_s是 (或 Unicode/MBCS-portable_tcscpy_s) 是 (Unicode) 或 const char* (ANSI)。const wchar_t* 上述範例會為這個引數傳遞一個 CString。 C++ 編譯器自動套用為 CString 類別定義的轉換函式,它會將 CString 轉換成 LPCTSTR。 定義從一個類型到另一個類型的轉型作業功能,是 C++ 最實用的功能之一。
使用標準運行時間連結庫字串函式
您應該能夠找到 CString 方法以執行任何字串作業,且對於這些作業您可能考慮使用標準 C 執行階段程式庫字串函式,例如 strcmp (或 Unicode/MBCS 可攜式 _tcscmp)。
如果您必須使用 C 執行時間字串函式,您可以使用使用 CString 作為 C 樣式 Null 終止字串中所述的技術。 您可以將 CString 物件複製到相等的 C 樣式字串緩衝區、在緩衝區上執行作業,然後將產生的 C 樣式字串指派回 CString 物件。
直接修改 CString 內容
在大多數情況下,您應該使用 CString 成員函式來修改 CString 物件的內容,或是將 CString 轉換成 C 樣式的字元字串。
有一些情況下,也可以直接修改 CString 內容,例如,當您使用需要字元緩衝區的作業系統函式時。
GetBuffer 和 ReleaseBuffer 方法提供對 CString 物件內部字元緩衝區的存取,並讓您直接修改它。 下列步驟顯示如何使用這些函式來達成此目的。
若要使用 GetBuffer 和 ReleaseBuffer 存取 對象的內部字元緩衝區CString
針對
GetBuffer物件呼叫CString並指定您需要的緩衝區長度。使用
GetBuffer傳回的指標直接將字元寫入CString物件。針對
ReleaseBuffer物件呼叫CString,更新所有內部CString狀態資訊,例如字串的長度。 直接修改CString物件的內容之後,您必須先呼叫ReleaseBuffer然後才呼叫任何其他CString成員函式。
搭配變數自變數函式使用 CString 物件
有些 C 函數接受可變數目的引數。 值得注意的範例是 printf_s。 由於這種函式的宣告方式,編譯器無法確定引數的類型,且無法判斷對每個引數要執行哪種轉換作業。 因此,很重要的一點是您要在傳遞 CString 物件給接受可變數目之引數的函式時,使用明確的類型轉型。
若要在變數自變數函式中使用 CString 物件,請明確地將 轉換成CStringLPCTSTR字元串,如下列範例所示。
CString kindOfFruit = _T("bananas");
int howmany = 25;
_tprintf_s(_T("You have %d %s\n"), howmany, (LPCTSTR)kindOfFruit);
指定 CString 正式參數
對於需要字串引數的大部分函式,最好是將函式原型中的正式參數指定為字元 (const) 的 LPCTSTR 指標,而不是 CString。 當正式參數指定為 const 字元的指標時,您可以將指標傳遞至 TCHAR 陣列、常值字串串 ["hi there"]或 CString 物件。 物件 CString 會自動轉換成 LPCTSTR。 您可以使用 LPCTSTR的任何位置,您也可以使用 CString 物件。
如果不會修改自變數, const CString&您也可以將正式參數指定為常數位符串參考(亦即 )。 const如果函式將修改字串,請卸除 修飾詞。 如果想要使用預設 null 值,請將它初始化為 null 字串 [""],如下所示:
void AddCustomer(const CString& name, const CString& address,
const CString& comment = _T(""));
對於大部分函式結果,您可以單純依值傳回 CString 物件。