2010-10-28 4 views
5

J'ai un TCHAR et la valeur comme ci-dessous:Comment puis-je substring un TCHAR

TCHAR   szDestPathRoot[MAX_PATH]="String This"; 

Maintenant, je veux les trois 1er caractère de TCHAR, comme ci-dessous:

szDestPathRoot.substring(0,2); 

Comment puis-je faire .

+0

Bonjour, vous devez utiliser 'MAX_PATH + 1' pour éviter les débordements. – Benoit

+0

@Benoit: 'MAX_PATH' est 260, ce qui inclut la longueur de terminaison nulle. (La longueur de chemin maximale prise en charge est de 255 caractères) Voir http://msdn.microsoft.com/en-us/library/aa365247.aspx –

+4

Votre chaîne littérale doit être incluse dans la macro '_T()'. Cela en fera un littéral de chaîne large dans les constructions Unicode. –

Répondre

12

TCHAR[] est un simple réseau à terminaison nulle (au lieu d'une classe C++). Par conséquent, il n'y a pas de méthode ".substring()".

TCHAR[] (par définition) peut être une chaîne de caractères large (Unicode) ou une simple chaîne de caractères (ASCII). Cela signifie qu'il y a wcs et str équivalents pour chaque fonction de chaîne (wcslen() vs strlen(), etc etc). Et un équivalent agnostique, à la compilation TCHAR qui peut être soit/soit.

L'équivalent de est tcsncpy().

mise en garde finale: déclarer un littéral TCHAR, il est préférable d'utiliser la _T() macro, comme indiqué dans l'extrait suivant:

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

Vous pouvez trouver ces liens pour intéresser:

+1

'TCHAR' n'est pas un type de tableau. – dreamlax

1

C'est un peu laid, mais si vous savez avec certitude que:

  1. La chaîne contient au moins 4 TCHAR (3 caractères plus la terminaison NUL)
  2. Le contenu de la chaîne peut être modifiée (qui est le cas dans votre exemple).
  3. Vous ne devez pas garder la chaîne d'origine intacte

Vous pouvez simplement mettre un NUL se terminant à la 4e position pour faire la chaîne 3 ombles longue.

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

Notez que cette opération est destructeur pour la chaîne d'origine

Vous devriez vraiment utiliser une classe de chaîne dans le code C++ bien.

+0

@Alexandre Jasmin, je ne comprends pas comment cette sous-chaîne szDestPathRoot. J'ai besoin de Str de l'affectation ci-dessus – Simsons

+0

@Subhen: Il a un bug (il devrait placer la valeur NULL à la position 4), mais ce qu'il fait est de limiter la longueur de la chaîne à x-1 nombre de caractères. Le code place le caractère de fin de chaîne (NULL) à la position trois, et donc la longueur de la chaîne en question devient deux. –

+1

@Billy ONeal s [0] = 'S'; s [1] = 'T'; s [2] = 'R'; s [3] = '\ 0'. Je compte trois caractères. –

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

@Blindy: memcpy est une méthode ansi c qui prend un const comme deuxième paramètre. Comment cela détruit-il la chaîne d'origine? – tidwall

1

Comme vous avez marqué votre question avec "C++", vous pouvez utiliser les classes de chaîne de la bibliothèque std:

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

Je ne veux pas convertir en chaîne – Simsons

+0

Ensuite, utilisez juste 'strncpy' ou' strncpy_s'. Mais, cependant, pourquoi ne pas utiliser les classes de chaînes de std? – Flinsch

+0

Désolé: 'wcsncpy' ou' wcsncpy_s' pour les chaînes unicode. – Flinsch