__int64からCStringが間違った値を返す-C ++ MFC

ルカ・コルシーニ

__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);

さらに、この行はATLCStringchar*(別名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年前に関連していたと述べています

代替手段は何ですか?十分な理由がない場合は、CStringWCRTをサポートするUnicode文字タイプの文字列)に明示的に固執してみてください定数またはプログラムで定義されているかどうかに依存する古風なデータ/テキストマッピングよりL 文字リテラルを優先します逆に、より良い方法は、の代わりになど、すべてのAPIおよび言語ライブラリ呼び出しのワイド文字バージョンを使用することです_UNICODE_MBCSwprintf()printf()

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

MFC C ++でIndexofを検索する

分類Dev

BackgroundColor OnMouseHover c ++ MFCを変更する方法

分類Dev

cのchar []から文字列を作成すると間違った値が返されます

分類Dev

MFC C ++ CEditから派生し、GetWindowTextを派生します

分類Dev

MFC:CStringを使用したLoadString

分類Dev

C#プロジェクトでC#文字列をMFC CStringに変換しますか?

分類Dev

C#-ビットからInt32に変換すると間違った値が生成されます

分類Dev

C#-ビットからInt32に変換すると間違った値が生成されます

分類Dev

C ++ std :: tmは、std :: chrono :: time_pointから変換した後、間違った値を返します

分類Dev

cの整数配列(例:int a []):a [i]を使用してアクセスすると、間違った値が返されるのはなぜですか。

分類Dev

c ++ / MFCで画像を拡大縮小する

分類Dev

MFC C ++でマルチスレッドを使用する

分類Dev

MFC c ++でバリアントをCOleSafeArrayに変換します

分類Dev

Cの罪計算コードが間違った値を返すのはなぜですか?

分類Dev

C#辞書が完全に間違った値を返す可能性はありますか?

分類Dev

MFC C ++でテキストに下線を引く方法

分類Dev

C#でのILリターンが間違った値を返す

分類Dev

カスタムオブジェクトの配列をC#.NETDLLからMFCに返す

分類Dev

C ++ / MFCの画像のExif情報が欲しいですか?(xnview.dllを使用)

分類Dev

エラーC1189MFC

分類Dev

C ++ MFC StretchDIBits PixelFormat8bppIndexed

分類Dev

C#で間違った値を返す再帰関数

分類Dev

間違った値を返すcのforループ

分類Dev

C ++で間違った値を返す関数

分類Dev

C ++で間違った型を返す

分類Dev

MFC C ++ CListBoxは選択されたアイテムを取得します

分類Dev

MFC(c ++)アプリケーションから起動された実行可能jarから戻り値を取得します

分類Dev

Mysql DBが間違った日付形式を返す(C#)

分類Dev

MFC / C ++コードを介してアイテムの幅を変更する

Related 関連記事

  1. 1

    MFC C ++でIndexofを検索する

  2. 2

    BackgroundColor OnMouseHover c ++ MFCを変更する方法

  3. 3

    cのchar []から文字列を作成すると間違った値が返されます

  4. 4

    MFC C ++ CEditから派生し、GetWindowTextを派生します

  5. 5

    MFC:CStringを使用したLoadString

  6. 6

    C#プロジェクトでC#文字列をMFC CStringに変換しますか?

  7. 7

    C#-ビットからInt32に変換すると間違った値が生成されます

  8. 8

    C#-ビットからInt32に変換すると間違った値が生成されます

  9. 9

    C ++ std :: tmは、std :: chrono :: time_pointから変換した後、間違った値を返します

  10. 10

    cの整数配列(例:int a []):a [i]を使用してアクセスすると、間違った値が返されるのはなぜですか。

  11. 11

    c ++ / MFCで画像を拡大縮小する

  12. 12

    MFC C ++でマルチスレッドを使用する

  13. 13

    MFC c ++でバリアントをCOleSafeArrayに変換します

  14. 14

    Cの罪計算コードが間違った値を返すのはなぜですか?

  15. 15

    C#辞書が完全に間違った値を返す可能性はありますか?

  16. 16

    MFC C ++でテキストに下線を引く方法

  17. 17

    C#でのILリターンが間違った値を返す

  18. 18

    カスタムオブジェクトの配列をC#.NETDLLからMFCに返す

  19. 19

    C ++ / MFCの画像のExif情報が欲しいですか?(xnview.dllを使用)

  20. 20

    エラーC1189MFC

  21. 21

    C ++ MFC StretchDIBits PixelFormat8bppIndexed

  22. 22

    C#で間違った値を返す再帰関数

  23. 23

    間違った値を返すcのforループ

  24. 24

    C ++で間違った値を返す関数

  25. 25

    C ++で間違った型を返す

  26. 26

    MFC C ++ CListBoxは選択されたアイテムを取得します

  27. 27

    MFC(c ++)アプリケーションから起動された実行可能jarから戻り値を取得します

  28. 28

    Mysql DBが間違った日付形式を返す(C#)

  29. 29

    MFC / C ++コードを介してアイテムの幅を変更する

ホットタグ

アーカイブ