共用方式為


CString 與 C 樣式字串相關的作業

CString物件包含字元字串數據。 CString會繼承類別範本CStringT中定義的方法和運算元集合,以使用字串數據。 (CStringtypedef 專門 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 內容,例如,當您使用需要字元緩衝區的作業系統函式時。

GetBufferReleaseBuffer 方法提供對 CString 物件內部字元緩衝區的存取,並讓您直接修改它。 下列步驟顯示如何使用這些函式來達成此目的。

若要使用 GetBufferReleaseBuffer 存取 對象的內部字元緩衝區CString

  1. 針對 GetBuffer 物件呼叫 CString 並指定您需要的緩衝區長度。

  2. 使用 GetBuffer 傳回的指標直接將字元寫入 CString 物件。

  3. 針對 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 物件。

另請參閱

字串 (ATL/MFC)
CString 自變數傳遞