CString
Operazioni relative alle stringhe in stile C
Un CString
oggetto contiene dati stringa di caratteri. CString
eredita il set dei metodi e degli operatori definiti nel modello CStringT
di classe per lavorare con i dati stringa. (CString
è un typedef
oggetto specializzato CStringT
per lavorare con il tipo di dati di tipo carattere che CString
supporta.
CString
non archivia i dati di tipo carattere internamente come stringa in formato C con terminazione null. CString
tiene invece traccia della lunghezza dei dati di tipo carattere in modo da poter controllare con maggiore sicurezza i dati e lo spazio necessario.
CString
non accetta stringhe in formato C ma consente di accedere ai dati di tipo carattere come stringa in formato C. Questo argomento contiene le seguenti sezioni che illustrano come usare l'oggetto CString
come se fosse una stringa in formato C con terminazione null.
Uso CString
di come stringa con terminazione Null in stile C
Per usare un CString
oggetto come stringa di tipo C, eseguire il cast dell'oggetto in LPCTSTR
. Nell'esempio seguente, CString
restituisce un puntatore a una stringa in formato C con terminazione null di sola lettura. La funzione strcpy
inserisce una copia della stringa in formato C nella variabile myString
.
CString aCString = "A string";
char myString[256];
strcpy(myString, (LPCTSTR)aCString);
È possibile usare i metodi di CString
, ad esempio SetAt
, per modificare i singoli caratteri nell'oggetto stringa. Tuttavia, il LPCTSTR
puntatore è temporaneo e diventa non valido quando viene apportata una modifica a CString
. L'oggetto CString
può anche uscire dall'ambito ed essere eliminato automaticamente. È consigliabile ottenere un puntatore aggiornato LPCTSTR
di un CString
oggetto ogni volta che si usa uno.
Talvolta potrebbe essere necessaria una copia dei dati di CString
da modificare direttamente. Usare la funzione strcpy_s
più sicura (o _tcscpy_s
per il formato portabile Unicode/MBCS) per copiare l'oggetto CString
in un buffer separato, dove è possibile modificare i caratteri in modo sicuro, come illustrato nell'esempio seguente.
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
Nota
Il terzo argomento di strcpy_s
(o Unicode/MBCS-portable _tcscpy_s
) è un (Unicode) o un const wchar_t*
( const char*
ANSI). L'esempio precedente passa un oggetto CString
per questo argomento. Il compilatore C++ applica automaticamente la funzione di conversione definita per la classe CString
che converte CString
in LPCTSTR
. La possibilità di definire le operazioni di cast da un tipo a un altro è una delle funzionalità più utili di C++.
Uso delle funzioni di stringa della libreria di runtime standard
È consigliabile trovare un metodo CString
per eseguire un'operazione di stringa per cui potrebbe essere necessario usare le funzioni della libreria run-time C standard come strcmp
(o _tcscmp
per il formato portabile Unicode/MBCS).
Se è necessario usare le funzioni stringa di runtime C, è possibile usare le tecniche descritte in Uso CString
come stringa con terminazione Null in stile C. È possibile copiare l'oggetto CString
in un buffer di stringa in formato C equivalente, eseguire le operazioni nel buffer e quindi riassegnare la stringa in formato C risultante a un oggetto CString
.
Modifica diretta del CString
contenuto
Nella maggior parte dei casi, è consigliabile usare le funzioni membro di CString
per modificare il contenuto di un oggetto CString
o per convertire l'oggetto CString
in una stringa di caratteri in formato C.
Ci sono casi in cui è opportuno modificare direttamente il contenuto di CString
, ad esempio quando si usano le funzioni del sistema operativo che richiedono un buffer di caratteri.
I metodi GetBuffer
e ReleaseBuffer
consentono di accedere al buffer di caratteri interno di un oggetto CString
e di modificarlo direttamente. I passaggi seguenti mostrano come usare queste funzioni a tale scopo.
Per usare GetBuffer
e ReleaseBuffer
per accedere al buffer di caratteri interno di un CString
oggetto
Chiamare
GetBuffer
per un oggettoCString
e specificare la lunghezza del buffer necessaria.Usare il puntatore restituito da
GetBuffer
per scrivere i caratteri direttamente nell'oggettoCString
.Chiamare
ReleaseBuffer
per l'oggettoCString
per aggiornare tutte le informazioni interne sullo stato diCString
, ad esempio la lunghezza della stringa. Dopo aver modificato direttamente il contenuto di un oggettoCString
, è necessario chiamareReleaseBuffer
prima di poter chiamare altre funzioni membro diCString
.
Uso di CString
oggetti con funzioni di argomento variabile
Alcune funzioni C accettano un numero variabile di argomenti. Un esempio rilevante è printf_s
. A causa del modo in cui questo tipo di funzione è dichiarato, il compilatore non può essere certo del tipo di argomenti né determinare l'operazione di conversione da eseguire per ogni argomento. Pertanto, è essenziale usare un cast di tipo esplicito per passare un oggetto CString
a una funzione che accetta un numero variabile di argomenti.
Per usare un CString
oggetto in una funzione di argomento variabile, eseguire il cast esplicito di CString
a una LPCTSTR
stringa, come illustrato nell'esempio seguente.
CString kindOfFruit = _T("bananas");
int howmany = 25;
_tprintf_s(_T("You have %d %s\n"), howmany, (LPCTSTR)kindOfFruit);
Specifica di CString
parametri formali
Per la maggior parte delle funzioni che richiedono un argomento stringa è consigliabile specificare il parametro formale nel prototipo di funzione come un puntatore const
a un carattere (LPCTSTR
) anziché CString
. Quando un parametro formale viene specificato come const
puntatore a un carattere, è possibile passare un puntatore a una TCHAR
matrice, una stringa letterale ["hi there"
]o un CString
oggetto . L'oggetto CString
verrà convertito automaticamente in un oggetto LPCTSTR
. Qualsiasi luogo in cui è possibile usare un LPCTSTR
oggetto , è anche possibile usare un CString
oggetto .
È anche possibile specificare un parametro formale come riferimento di stringa costante ,ovvero const CString&
, se l'argomento non verrà modificato. Eliminare il const
modificatore se la stringa verrà modificata dalla funzione . Per avere un valore null predefinito, inizializzarlo a una stringa null [""
], come mostrato di seguito:
void AddCustomer(const CString& name, const CString& address,
const CString& comment = _T(""));
Per la maggior parte dei risultati di funzione, è sufficiente restituire un oggetto CString
per valore.