2016-01-22 2 views
-1

La pièce de code suivant provoque un accidentL'utilisation de plus de deux caractères larges dans swprintf provoque un plantage?

« exception non gérée à 0x01C006AB dans ASMaplePro.exe: 0xC0000005: emplacement lecture Violation d'accès 0x003A0043 »

TCHAR text[512]={0},text2[256]={0}; 
char text1[128]={0}; 
strcpy(text1,_T("how are you"); 
wcscpy(text2,_T(" Bob?")); 
swprintf(text,_T("%s\\%s"),(CA2W)text1,text2); 

Je soupçonne que son parce que je suis à la fois en utilisant « texte 'et' list 'qui sont prises en tant que tampons de caractères larges en une seule fois!

Mais quelqu'un peut-il me dire pourquoi exactement l'accident est causé.

+0

Ce code ne compile même pas, et encore moins provoquer un plantage. –

+1

Est-ce que ce code compile même? 'strcpy' prend un' const char * 'et' wcscpy' prend un 'const wchar_t *' et '_T' se traduit par l'un ou par l'autre. Pas les deux. –

+0

Vous avez des erreurs partout. J'obtiens aussi des erreurs que _T et CA2W ne sont pas définies, mais j'inclus Windows.h. – Archimaredes

Répondre

1

Essayez de ne pas utiliser TCHAR, comme mentionné dans le commentaire, cela pourrait signifier soit ANSI char ou UTF16 whar_t, selon le ou non UNICODE wether a été défini. TCHAR est inutile au mieux, sauf si vous ciblez Windows 98.

La chose T() peut être source de confusion aussi, encore une fois cela pourrait signifier ANSI ou Unicode. Utilisez plutôt le préfixe L pour les chaînes Unicode.

Le deuxième argument swprintf doit être tampon taille maximale:

char ansi[128] = { 0 }; 
wchar_t unicode[256] = { 0 }; 
wchar_t unicode2[128] = { 0 }; 

strcpy(ansi, "how are you"); 
wcscpy(unicode, L" Bob?"); 

wcscpy(unicode2, CA2W(ansi)); 

wchar_t result[512]; 
swprintf(result, 512, L"%s %s", unicode, unicode2); 
+0

Est-il obligatoire que je devrais copier ansi-x-unicode2 et ensuite l'utiliser? Qu'est-ce qui ne va pas avec swprintf (résultat, 512, L "% s% s", unicode, (CA2W) ansi) ;? – abejoe

+0

Coller des choses dans une fonction rend plus difficile le débogage, mais je suppose que vous pouvez l'utiliser de cette façon si vous le souhaitez. –

+0

donc maintenant ma déclaration est comme swprintf (résultat, 512, L "% s% s", (CA2W) ansi, unicode); Mais seuls les personnages d'ansi sont ajoutés au résultat. les caractères d'unicode ne sont pas ajoutés au résultat. – abejoe