4

wchar_t*パラメータとして をフォーマットして取得しようとしintています。私はたくさんグーグルで検索しましたが、もっと混乱してしまいました。したがって、次のコードを検討してください。

int main(int argc, char** argv) {

   wchar_t buf[16];
   wsprintf(buf, L"%d", 5);
   wprintf(L"[%ls]\n", buf);

   system("pause");
   return 0;

};

wchar_t、 、 がそれぞれ 、 、と同等のワイド文字であるwsprintfと仮定すると、上記は を出力すると予想していましたが、 と の間にゴミが出力されます。望ましい結果を達成するための正しい方法は何ですか? そして、私はここで何を誤解していますか?wprintfcharsprintfprintf[5][]

(ここでは、移植性がセキュリティよりも重要であることを明確にする必要があるため、より安全なベンダー固有の拡張機能の代わりに、この関数ファミリを使用するソリューションを知りたいです。)

4

3 に答える 3

7

wsprintf()は Windows 固有の機能であり、Unix では使用できません。あなたが達成したいことは、より移植性の高い方法で行うことができます(私はこのわずかに変更されたコードスニペットを試しましたが、期待どおりに機能しました):

#include <wchar.h>
#include <stdio.h>

int main(int argc, char **argv)
{
    wchar_t buf[16];
    swprintf(buf, sizeof(buf) / sizeof(*buf), L"%d", 5);
    wprintf(L"[%ls]\n", buf);

    return 0;
}

出力:

[5]
于 2013-01-05T15:46:29.013 に答える
3

wsprintf()Microsoft のハイブリッド機能の 1 つです。_UNICODE前処理中に が定義されているかどうかによって、異なる署名があります。(ボンネットの下で何が起こっているのか、そのシンボルの存在または非存在に#ifdef取って代わるwsprintfwsprintfAまたはそれwsprintfWに基づく があります。)

が定義されている場合_UNICODE、バッファが であることを期待しますwchar_t[]

が定義されていない場合_UNICODE(通常はデフォルト)、バッファが であると想定しますchar[]。それがここで起こっていることです。警告がオンになっている場合は、互換性のないポインター型に関する警告が表示される可能性があります。ガベージは、格納されている 8 ビット ascii がbufによって Unicode として解釈されているためwprintf()です。

于 2015-09-16T13:16:55.433 に答える
1

出力に不適切な書式指定子を使用しているようです。私はあなたが望むだろうと思うだろう

wprintf(L"[%s]\n", buf);

%ls は指定子の無効な組み合わせのようです - l は s "string" 型指定子の "long int" サイズ プレフィックスです。私が wprintf で見つけたドキュメントは、「s」型指定子をワイド文字列を指すものとして扱うことを示しています (少なくとも MS Visual Studio の場合)。

于 2013-01-05T15:39:55.617 に答える