swprintfを使用した数値型の変換について


のぶ  2007-02-03 23:20:42  No: 64371

はじめまして。
swprintfを使用して、数値型の値をWCHAR型の領域に格納することができずに困ってます。。。もしかしたら大きな認識違いをしてるのでしょうか

例)
int   work_index = 1;
WCHAR PathName[256];

swprintf( PathName, L"%s%d", L"AAAAA", work_index);

結果としては、PathNameにはAAAAAしかはいらない様に見えます


夏みかん  2007-02-03 23:39:38  No: 64372

SetWindowText関数には2つの関数があります。
①SetWindowTextA関数→シフトJISコード用
②SetWindowTextW関数→Unicodeコード用
通常はコンパイル時に SetWindowText 関数がどちらか一方の関数を #define で
定義して関数を呼び出します。

このことからシフトJISコード環境で、一部だけ Unicode 文字を扱う場合は、
Unicode コード用関数を直接呼び出します。

よって、wsprintfW という関数に変えてみてはどうでしょう。
以上。試してみて下さい。


Blue  2007-02-04 01:00:03  No: 64373

コードは間違ってはいないようです。
(WinAPIではないのでUnicodeビルドとか関係ないが)

>結果としては、PathNameにはAAAAAしかはいらない様に見えます
どのようにして確認しましたか?

もしかしたらロケールを設定しないとだめとか。

_wsetlocale(LC_ALL, L"japanese");


PATIO  2007-02-05 23:57:44  No: 64374

確認に使った手段まで含めて公開しないと
確認手段がおかしいかどうかの判断が付かないですね。
その辺まで含めて説明した方が良いと思いますよ。


どら  2007-02-08 18:39:43  No: 64375

ing APIENTRY WinMain(・・・)
{
  WCHAR PathName[256];
  int a = 1;

  swprintf(PathName, L"%s%d", L"AAAA", a);
  return 1;                                       //ここにブレイクポイントを指定
}

Windows XP + VC++.NET2003で、以上のようなコードで、ブレイクポイントでPathNameをウオッチしたら、問題無く「AAAA1」になっていました。
この時、プロジェクトはUnicodeではなく、マルチバイトの設定にはなっていましたが、普通にいけています。

Blueさんや、PATIOさんが仰るとおり、確認手段は公開した方がいいです。
今のままだと
     ・変数に正しく値が格納されていない
     ・格納はされているが、表示がおかしい
のどちらかがわかりません。

確認したときにデバッグモードでウオッチしたのでないのであれば、どの関数で表示確認をしたのかも明記した方がいいですよ^^


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加