__int64変数をCStringに変換したいと思います。コードはまさにこれです
__int64 i64TotalGB;
CString totalSpace;
i64TotalGB = 150;
printf("disk space: %I64d GB\n", i64TotalGB);
totalSpace.Format(_T("%I64d", i64TotalGB));
printf("totalSpace contains: %s", totalSpace);
最初のprintfプリント
"disk space: 150GB"
これは正しいですが、2番目のprintfは次のようにランダムに高い数値を出力します
"totalSpace contains: 298070026817519929"
また、__ int64変数の代わりにINT64変数を使用しようとしましたが、結果は同じです。これの原因は何でしょうか?
ここに:
totalSpace.Format(_T("%I64d", i64TotalGB));
に2番目の引数として渡すのではなくi64TotalGB
、_T()
マクロに引数として渡しますFormat()
。
これを試して:
totalSpace.Format(_T("%I64d"), i64TotalGB);
そうは言っても、文字エンコードに関するMSの混乱(ha)のおかげで、_T
ここでの使用は、ではなくCString
で構成されているため、正しいことではTCHAR
ありません_TCHAR
。したがって、それを考慮に入れると、に依存し、依存しないため、のTEXT()
代わりに使用することもできます。T()
UNICODE
_UNICODE
totalSpace.Format(TEXT("%I64d"), i64TotalGB);
さらに、この行はATLCString
をchar*
(別名Cスタイルの文字列)として渡そうとするため、間違っています。
printf("totalSpace contains: %s", totalSpace);
コンパイラがこの警告を出す対象:
warning C4477: 'printf' : format string '%s' requires an argument of type 'char *', but variadic argument 1 has type 'ATL::CString'
の構造CString
は、あなたが持っているようにそれを渡すことと実質的に互換性がありますが、これはまだ正式に未定義の動作です。CString::GetString()
それを防ぐために使用します。
printf("totalSpace contains: %ls", totalSpace.GetString());
%ls
私の設定でtotalSpace.GetString()
は、がを返したことに注意してくださいconst wchar_t*
。ただし、「printf
現在、UNICODEストリームへの出力をサポートしていません。」、現在のコードページ外の文字をサポートするこの行の正しいバージョンwprintf()
は、次の方法での呼び出しです。
wprintf("totalSpace contains: %s", totalSpace.GetString());
とはいえ、質問の背後にある直接的な問題に関係なく、ここに一般的なアドバイスがあります。今日のはるかに優れた慣行は、まったく異なります。@ IInspectableによる立派な回答から、「一般的なテキストのマッピングは20年前に関連していた」と述べています。
代替手段は何ですか?十分な理由がない場合は、CStringW
(CRTをサポートするUnicode文字タイプの文字列)に明示的に固執してみてください。定数またはプログラムで定義されているかどうかに依存する古風なデータ/テキストマッピングよりも、L
文字リテラルを優先します。逆に、より良い方法は、の代わりになど、すべてのAPIおよび言語ライブラリ呼び出しのワイド文字バージョンを使用することです。_UNICODE
_MBCS
wprintf()
printf()
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加