WriteConsole()奇怪的字符?

时间:2009-07-07 12:33:55

标签: c++ windows console

我使用此代码段在dll中创建一个控制台。那个dll会在游戏中被加载。

CODE SNIPPET

控制台窗口创建正常。但是当我写东西时,我只是得到“??? D ??”之类的东西。

我知道我必须使用printf()语法。所以我用

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

任何指针?

5 个答案:

答案 0 :(得分:3)

尝试使用:

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

因为wprintf将宽字符串作为输入

编辑:基于以下事实:%s和%S的行为在wprintf中使用时会发生什么变化:

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

wprintf中的%s期望这个L“test”是一个宽字符串。我删除了格式参数的“L”,因为wprintf定义为:

int wprintf(char *fmt, ...)

答案 1 :(得分:1)

你正在调用wprintf(),这是printf()例程的“宽字符”版本。这些“宽字符”函数有一个令人讨厌的问题,因为“%s”的含义发生了变化:

printf() - “%s”表示参数是普通字符串,“%S”表示它是一个宽字符串

wprintf() - “%s”表示参数是宽字符串,“%S”表示它是普通字符串

因此,您对wprintf()的调用告诉它该参数是一个宽字符串,但它不是:将其更改为

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

答案 2 :(得分:1)

一个好习惯是使用可移植性宏_T(),它在我们使用ASCII时什么都不做,并在定义UNICODE时用L替换所有字符串。并且使用_t前置函数,这些函数实际上只是在我们使用ASCII时映射到普通函数的宏,并在定义UNICODE时映射到w前置函数。这样你总是有一个可移植的代码 - 它适用于两个版本:

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

答案 3 :(得分:0)

“%s”格式字符串告诉wprintf它应该将第一个参数解释为宽字符串。

要避免这些混合编码问题,可以使用TCHAR宏:

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

答案 4 :(得分:-1)

您的编码错误,因为您使用的是wstring字符,但可能只有ascii控制台。确保您在控制台中使用unicode字体。