2017-10-19 8 views
0

いくつかのコードをマルチバイトからユニコードに移動していて、文字列のフォーマットが間違っています。 Visual Studio 2015では、sprintf()とwsprintf()の間でwidth引数の指定子 '*'が異なるように見えます。これはコンパイラのバグか副作用ですか、それとも本当に明白な何かが欠けていますか?VS2015のsprintf()とwsprintf()の相違点をフォーマットする

出力と、以下のコード、:

char cOutA [ 64 ]; 
wchar_t wcOutA [ 64 ]; 

sprintf (cOutA, "Multibyte = %.*f\n", 3, 2.12345); 
wsprintf (wcOutA, L"Unicode = %.*f\n", 3, 2.12345); 

printf (cOutA); 
wprintf (wcOutA); 

出力:

Multibyte = 2.123 
Unicode = *f 

私は両方とも3桁まで私に浮動小数点数を与えるために期待していました。私は間違って何をしていますか?

+0

wsprintfはWindowsに組み込まれたヘルパー関数でした。 Win3に戻って、OSとそのアプリケーションを640KBのメモリに詰め込む必要があります。それは1つのコーナーをカットし、浮動小数点をサポートしていません。 MSDNの記事は「使用しないでください」と怒鳴ります。 swprintfの代わりにCRT関数を使用してください。 –

+0

あなたはHansですが、MSDNのドキュメントとコンパイラは、C標準ライブラリの文字列関数のすべてについて私に教えてくれるし、古いコードをコンパイルしています。しかし、wsprintf()は浮動小数点数に対して壊れていますが、swprintf()は浮動小数点数に対しては壊れているようです。これは、特に他のTCHAR関数が名前に「t」を持つ傾向があるため、それらを混在させることが容易であるので、むしろ混乱しているようです。 _tcscpy() – Piers

答えて

0

コメントにHansが述べたように、答えはwsprintf()を使用しないでください。それはいつも壊れていて、Cの標準の "swprintf()"と同じ書式設定引数をサポートしておらず、Microsoftのドキュメントは、それがどうやって壊れているのか、なぜそれが明確でないのか分かりません。

私は、関連する関数をデバッグしようとしているときにのみこれを発見しました:wvsprintf()。この関数には同じ制限があるようですが、その代わりに、 "vswprintf()"の代わりに使用する必要があります。標準のCライブラリ関数と命名方法との見た目が近似しているのと同様に、名前の作業バージョンとの類似点は非常に残念です。私は2017年にこれらの関数が引き続き提供されているのか、Microsoftコンパイラが "sprintf()"と同じようにサポートされていない引数でも警告を生成しないのはなぜかわかりません。

Googleでこれらの機能を検索しても、このような巨大な欠陥は明らかではないようです。

関連する問題