CString
與 C 樣式字串相關的作業
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
物件,請明確地將 轉換成CString
LPCTSTR
字元串,如下列範例所示。
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
物件。