2010-10-28 5 views
5

Tengo un TCHAR y el valor de la siguiente manera:Como puedo subcadena un TCHAR

TCHAR   szDestPathRoot[MAX_PATH]="String This"; 

Ahora quiero que el primero de tres caracteres de TCHAR, como a continuación:

szDestPathRoot.substring(0,2); 

¿Cómo puedo hacer esto .

+0

Hola, debe utilizar 'MAX_PATH + 1' para evitar desbordamientos. – Benoit

+0

@Benoit: 'MAX_PATH' es 260, que incluye la longitud de terminación nula. (La longitud máxima admitida de la ruta es de 255 caracteres) Consulte http://msdn.microsoft.com/en-us/library/aa365247.aspx –

+4

. El literal de la cadena debe incluirse en la macro '_T()'. Eso lo convertirá en una gran cadena literal en compilaciones Unicode. –

Respuesta

12

TCHAR[] es un simple matriz terminada en nulo (en lugar de una clase de C++). Como resultado, no hay un método ".substring()".

TCHAR[] (por definición) puede ser una cadena de caracteres anchos (Unicode) o una cadena de caracteres simple (ASCII). Esto significa que hay wcs y str equivalentes para cada función de cadena (wcslen() contra strlen(), etc.). Y un equivalente agnóstico de TCHAR en tiempo de compilación que puede ser/o.

El equivalente TCHAR de strncpy() es tcsncpy().

salvedad final: declarar un TCHAR literal, lo mejor es utilizar el _T() macro, como se muestra en el siguiente fragmento:

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

Usted puede encontrar estos enlaces a ser de su interés:

+1

'TCHAR' no es un tipo de matriz. – dreamlax

1

Esto es algo feo, pero si se sabe con certeza que:

  1. La cadena tiene al menos 4 TCHAR (3 caracteres más el NUL de terminación)
  2. El contenido de la cadena puede ser modificado (que es el caso en tu ejemplo).
  3. Usted no tiene que mantener a la cadena original intacta

Se podía poner un NUL que termina en la cuarta posición para hacer el carbón de leña de cadena larga 3.

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

Tenga en cuenta que esta operación es destructivo para la cadena original

Usted realmente debe utilizar una clase de cadena en C++ código embargo.

+0

@Alexandre Jasmin, no entiendo cómo funciona esta subcadena de szDestPathRoot. Necesito Str de la asignación anterior – Simsons

+0

@Subhen: tiene un error (debe colocar el NULL en la posición 4), pero lo que hace es limitar la longitud de la cadena a x-1 número de caracteres. El código coloca el carácter de final de cadena (NULL) en la posición tres, y por lo tanto la longitud de la cadena en cuestión se convierte en dos. –

+1

@Billy ONeal s [0] = 'S'; s [1] = 'T'; s [2] = 'R'; s [3] = '\ 0'. Cuento tres caracteres. –

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

@Blindy: memcpy es un método ansi c que toma const como el segundo param. ¿Cómo destruye esto la cuerda original? – tidwall

1

Como se ha etiquetado su pregunta con "C++" que pueden utilizarse las clases de cuerdas de la biblioteca std:

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

No quiero convertir a la cadena – Simsons

+0

Entonces simplemente use 'strncpy' o' strncpy_s'. Pero, sin embargo, ¿por qué no usar las clases de cadenas de std? – Flinsch

+0

Lo sentimos: 'wcsncpy' o' wcsncpy_s' para cadenas de caracteres unicode. – Flinsch