2009-07-07 15 views
3

私はこのスニペットを使用して、dllの中にコンソールfronを作成します。そのDLLはゲームにロードされます。WriteConsole()不自然な文字ですか?

CODE SNIPPET

コンソールウィンドウが罰金作成されます。しかし、私はそれにものを書くとき、私はちょうど "??? D ??"のようなものを得る。

私はprintf()構文を使用する必要があることを知っています。だから私は使用する

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

すべてのポインタ?

答えて

3

を使用してみてくださいwprintfの内容:

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

wprintfの%sはワイド文字列を必要としますエスト "です。
wprintfは次のように定義されているので、私はformatパラメータに「L」を削除:あなたはwprintf()、printf関数の「ワイド文字」バージョン()ルーチンを呼び出している

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

'void wprintf(char *、...)) ':引数1を' const wchar_t [18] 'から' char * 'に変換できません – SSpoke

-1

wstring文字を使用しているためエンコーディングが間違っていますが、おそらくASCIIコンソールしかありません。コンソールでユニコードフォントを使用していることを確認してください。 wprintf編集入力として

をワイド文字列を取るよう

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

を::%sの動作と%S変更はで使用されるという事実に基づいて

+0

ああ、私はUnicodeのサポートを必要としないので、ansi関数に書き直してください。 – JustFogMaxi

+0

彼はwprintf引数としてwstring文字を使用していません。 – xtofl

1

。 "%s"の意味が変わるという点で、これらの "ワイドキャラクタ"関数には1つの厄介なキャッチがあります:

printf() - "%s"は引数が普通の文字列であることを意味し、 "%S"はそれを意味しますワイド文字列

wprintf() - 「%s」の引数はワイド文字列であることを意味し、「%Sは、」それはそうwprintfへのお電話は()ことを通知された通常の文字列

だ意味します引数はワイド文字の文字列ですが、そうではありません。

+0

%sと%Sの意味は、呼び出される関数によって変わるのではないかと思います。関数の違いは、wprintfがワイド文字列として書式を取り、printfが通常の文字列を取ります。 – Key

+1

少なくともWindowsでは(これについてはここで言及しています)、それはします:http://msdn.microsoft.com/en-us/library/hf4y5e3w%28VS.100%29.aspx – DavidK

+1

あなたは正しいですか。私はそれが狂気だと思う。 – Key

0

"%s" ringはwprintfに最初の引数をワイド文字列として解釈する必要があることを伝えます。

これらの混合エンコーディングの問題を回避するには、使用することができますTCHARマクロの:

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

良い習慣は、私たちがASCIIを使用するときに何もしないとLとのすべての文字列を付加しますポータビリティマクロ_T()を使用することですUNICODEが定義されているときまた、_tを使用するとprepended関数が使用されます。これは、ASCIIを使用するときはプレーン関数にマップし、UNICODEが定義されているときはwの前に付いた関数にマップします。あなたはいつも、両方のバージョンで動作する移植可能なコードを持っています。

_tprintf(_T("%s"),_T("test"); 
関連する問題