2009-07-07 9 views
3

J'utilise cet extrait pour créer une console à l'intérieur d'une DLL. Cette DLL est chargée dans un jeu.WriteConsole() caractères étranges?

CODE SNIPPET

La fenêtre console crée bien. Mais quand j'écris des choses, je reçois juste des trucs comme "??? D ??".

Je sais que je dois utiliser la syntaxe printf(). Donc j'utilise

wprintf("%s", "test"); 

Des pointeurs?

Répondre

3

Essayez d'utiliser:

wprintf(L"%s", "test"); 

comme wprintf prend une grande chaîne de caractères comme entrée

Modifier: Compte tenu du fait que le comportement de% s et% des changements de S lorsqu'il est utilisé wprintf qu'en est-il:

wprintf("%s", L"test"); 

Le% s dans wprintf attend une chaîne de caractères large cette L "t est "est".
J'ai enlevé le "L" sur le paramètre de format depuis wprintf est défini comme:

int wprintf(char *fmt, ...) 
+0

'void wprintf (char *, ...) ': impossible de convertir l'argument 1 de' const wchar_t [18] 'en' char * ' – SSpoke

-1

Votre encodage est incorrect, car vous utilisez des caractères wstring, mais vous n'avez probablement qu'une console ascii. Assurez-vous que vous utilisez une police Unicode dans votre console.

+0

Ahh, je n'ai pas besoin d'un support Unicode si mal juste le réécrire aux fonctions ansi. – JustFogMaxi

+0

Il n'utilise pas les caractères wstring comme argument wprintf. – xtofl

1

Vous appelez wprintf(), la version "grand caractère" de la routine printf(). Il y a une mauvaise capture avec ces fonctions "à caractères larges", en ce sens que la signification de "% s" change:

printf() - "% s" signifie que l'argument est une chaîne normale, "% S" signifie que c'est un grand caractère chaîne

wprintf() - « % s » signifie argument est une chaîne de caractères larges, « % s » signifie qu'il est une chaîne normale

donc votre appel à wprintf() est lui indiquant que le argument est une chaîne de caractères larges, mais ce n'est pas: changer pour

printf("%s", "test"); 
+0

Je doute que la signification de% s et% S change en fonction de la fonction appelée. La différence entre les fonctions est que wprintf prend le format comme une chaîne de caractères large et printf prend une chaîne normale. – Key

+1

Au moins sur Windows (ce dont nous parlons ici), c'est le cas: voir http://msdn.microsoft.com/fr-fr/library/hf4y5e3w%28VS.100%29.aspx – DavidK

+1

Vous avez raison . Je pense que c'est de la folie. – Key

0

le format « % s » st ring indique à wprintf qu'il doit interpréter le premier argument comme une chaîne de caractères large.

Pour éviter ces problèmes de codage mixte, vous pouvez utiliser la de macro TCHAR:

LPCTSTR pName = _T("World"); 
_tprintf(_T("%s, %s"), _T("Hello"), pName); 
1

Une bonne habitude est d'utiliser la portabilité _T macro() qui ne fait rien lorsque nous utilisons ASCII et prepends toutes les chaînes avec L quand UNICODE est défini. Et en utilisant les fonctions préfixées _t qui ne sont en réalité que des macros qui correspondent à des fonctions simples lorsque nous utilisons ASCII et que nous les mappons à des fonctions prédéfinies lorsque UNICODE est défini. De cette façon, vous avez toujours un code portable - qui fonctionne dans les deux versions:

_tprintf(_T("%s"),_T("test"); 
Questions connexes