31

次のコードを試しました:

wprintf(L"1 %s\n","some string"); //Good
wprintf(L"2 %s\n",L"some string"); //Not good -> print only first character of the string
printf("3 %s\n","some string"); //Good
//printf("4 %s\n",L"some string"); //Doesn't compile
printf("\n");
wprintf(L"1 %S\n","some string"); //Not good -> print some funny stuff
wprintf(L"2 %S\n",L"some string"); //Good
//printf("3 %S\n","some string"); //Doesn't compile
printf("4 %S\n",L"some string");  //Good

そして、次の出力が得られます。

1 some string
2 s
3 some string

1 g1 %s

2 some string
4 some string

したがって、 と の両方が char* と wchar* の両方を正しく出力できるように見えwprintfますprintfが、正確な指定子が使用されている場合に限られます。間違った指定子を使用すると、コンパイル エラーが発生せず (警告もありません!)、間違った動作が発生する可能性があります。あなたは同じ行動を経験していますか?

注: これは Windows でテストされ、MinGW とg++ 4.7.2 でコンパイルされました (後で gcc を確認します) 。

編集: %ls も試しました (結果はコメントにあります)

printf("\n");
wprintf(L"1 %ls\n","some string"); //Not good -> print funny stuff
wprintf(L"2 %ls\n",L"some string"); //Good
// printf("3 %ls\n","some string"); //Doesn't compile
printf("4 %ls\n",L"some string");  //Good
4

7 に答える 7

27

GCC (mingw) にはprintf、Windows でのワイド機能のチェックを無効にするカスタム コードがあると思われます。これは、Microsoft 独自の実装 (MSVCRT) がひどく間違っており、ワイド関数に対して%sとが%ls 逆になっているためです。printfGCC は、あなたが MS の壊れた実装にリンクしようとしているのか、修正された実装にリンクしようとしているのかわからないので、最も目立たない方法は、警告を止めることです。

于 2013-07-17T14:13:35.233 に答える
6

s の場合: printf 関数で使用する場合、シングルバイトまたはマルチバイトの文字列を指定します。wprintf 関数で使用する場合、ワイド文字列を指定します。文字は、最初のヌル文字まで、または精度の値に達するまで表示されます。

S の場合: printf 関数で使用する場合、ワイド文字列を指定します。wprintf 関数で使用する場合、シングルバイトまたはマルチバイトの文字列を指定します。文字は、最初のヌル文字まで、または精度の値に達するまで表示されます。

Unix ライクなプラットフォームでは、s と S は Windows プラットフォームと同じ意味です。

参照: https://msdn.microsoft.com/en-us/library/hf4y5e3w.aspx

于 2015-09-04T06:12:55.170 に答える
0

%SThe Single Unix Specification v2に準拠しているようで、現在の (2008) POSIX 仕様の一部でもあります。

同等の C99 準拠のフォーマット指定子は%sand%lsです。

于 2013-07-17T13:25:56.827 に答える