2010-10-28 15 views
5

Ho un TCHAR e valore come di seguito:Come posso substring un TCHAR

TCHAR   szDestPathRoot[MAX_PATH]="String This"; 

Ora voglio il primo di tre caratteri da TCHAR, come di seguito:

szDestPathRoot.substring(0,2); 

Come posso fare questo .

+0

Ciao, è necessario utilizzare 'MAX_PATH + 1' per evitare overflow. – Benoit

+0

@Benoit: 'MAX_PATH' è 260, che include la lunghezza di terminazione nulla. (La lunghezza massima del percorso supportato è di 255 caratteri) Vedere http://msdn.microsoft.com/en-us/library/aa365247.aspx –

+4

La stringa letterale deve essere racchiusa nella macro '_T()'. Ciò lo renderà un vero e proprio string letterale nelle build unicode. –

risposta

12

TCHAR[] è un semplice array terminazione Null (piuttosto che una classe C++). Di conseguenza, non esiste un metodo ".substring()".

TCHAR[] (per definizione) può essere una stringa di caratteri ampia (Unicode) o una stringa di caratteri semplice (ASCII). Ciò significa che esistono wcs e str equivalenti per ciascuna funzione di stringa (wcslen() rispetto a strlen(), ecc. Ecc.). E un equivalente agnostico, in fase di compilazione, TCHAR che può essere/o.

L'equivalente TCHAR di strncpy() è tcsncpy().

avvertimento finale: per dichiarare un TCHAR letterale, è meglio utilizzare il _T() macro, come mostrato nel seguente frammento di codice:

TCHAR szDestPathRoot[MAX_PATH] = _T("String This"); 
TCHAR szStrNew[4]; 
_tcsncpy (str_new, szTestPathRoot, 3); 

Si possono trovare questi collegamenti per essere di interesse:

+1

'TCHAR' non è un tipo di array. – dreamlax

1

Questo è un po brutto, ma se si sa per certo che:

  1. La stringa possiede almeno 4 TCHAR (3 caratteri più il NUL di terminazione)
  2. Il contenuto della stringa può essere modificata (che è il caso nel tuo esempio).
  3. Non hai per mantenere la stringa originale intatto

Si può solo mettere un NUL termina al 4 ° posizione per fare lungo il char stringa di 3.

szDestPathRoot[3] = _T('\0'); 

Si noti che questa operazione è distruttivo per la stringa originale

Si dovrebbe davvero utilizzare un classe string in C++ di codice però.

+0

@Alexandre Jasmin, non capisco come fa questa sottostringa szDestPathRoot. Ho bisogno di Str dall'assegnazione precedente – Simsons

+0

@Subhen: Ha un bug (dovrebbe essere posizionato il NULL nella posizione 4), ma ciò che fa è limitare la lunghezza della stringa al numero x-1 di caratteri. Il codice posiziona il carattere di fine stringa (NULL) nella posizione tre, e quindi la lunghezza della stringa in questione diventa due. –

+1

@Billy ONeal s [0] = 'S'; s [1] = T '; s [2] = 'R'; s [3] = '\ 0'. Conto tre caratteri. –

3
TCHAR szDestPathRoot[MAX_PATH]="String This"; 
TCHAR substringValue[4] = {0}; 
memcpy(substringValue, szDestPathRoot, sizeof(TCHAR) * 3); 
+2

@Blindy: memcpy è un metodo ansi c che accetta un const come secondo parametro. Come fa a distruggere la stringa originale? – tidwall

1

Come avete etichettato tua domanda con "C++" è possibile utilizzare le classi stringa della biblioteca std:

std::wstring strDestPathRoot(_T("String This")); 
strDestPathRoot.substr(0, 2); 
+0

Non voglio convertire in stringa – Simsons

+0

Quindi basta usare 'strncpy' o' strncpy_s'. Ma, comunque, perché non usare le classi di stringa di std? – Flinsch

+0

Ci scusiamo: 'wcsncpy' o' wcsncpy_s' per stringhe Unicode. – Flinsch