Visual C++6.0での書式指定について教えてください

このQ&Aのポイント
  • Visual C++6.0を使用している際に、メッセージボックス内での書式指定方法について教えてください。
  • 上記のコードを実行した際に、値が正しく表示されない問題が発生しています。デバッガーで確認したところ、変数maxには正しい値が格納されているようですが、表示されない現象が起きています。
  • double型の値を表示させる方法について教えてください。
回答を見る
  • ベストアンサー

MessageBoxでの、書式指定を教えて下さい。

Windowsで、Visual C++6.0を、使っています。 double max; char szBuf[256]; wsprintf(szBuf,"左 Yの最大値は、%d ",max); MessageBox(hWnd, szBuf, "各最大値", MB_OK); 上記を、実行した時、正しい値を表示してくれません。 デバッガーで見ると、maxには、正しい値、768.55というような値が、入っているようです。 %dを、%fとすると fを表示して値を表示しません。 double型の値を表示させるには、どうしたらいいのでしょうか? 教えて下さい。どうぞよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

wsprintfをドキュメント/マニュアルで引いてみてください。 float/double は受理されません。 sprintf を使ってはいかがでしょう。

ccppmaster
質問者

お礼

早速の回答ありがとうございました。 sprintfで、予定通りの結果を得ることが出来ました。 >wsprintfをドキュメント/マニュアルで引いてみてください。 引いてみたのですが、float/doubleに対する、書式指定が、無かったので、行き詰まってしまいました。 sprintfは、別物という感じがしていましたので、  sprintfは、使えないのではと思っていました。 ありがとうございました。

関連するQ&A

  • case で宣言コンパイルエラー

     switch (msg){  case WM_LBUTTONDOWN:   char *p = new char[1000];   wsprintf(p, "%d" , i);   MessageBox(hWnd , p , "" , MB_OK);   delete[] p;  break; がエラーで  switch (msg){  case WM_LBUTTONDOWN:   char *p;   p = new char[1000];   wsprintf(p, "%d" , i);   MessageBox(hWnd , p , "" , MB_OK);   delete[] p;  break; と  switch (msg){  case WM_KEYDOWN:   if( wParam == VK_RETURN ){    char *p = new char[1000];    wsprintf(p, "%d" , i);    MessageBox(hWnd , p , "" , MB_OK);    delete[] p;   }  break; ならエラーじゃなかったんだけど、理由がよく分かりません。 case のすぐ下で宣言と同時に値を代入してはいけないんですか?

  • ダイアログなどの文字列が文字化けする

    VS2005でWindowsプログラムをし始めたばかりの初心者です。 タイトルのことで質問があります。 参考書として「猫でもわかるwindowsプログラミング」 というのを使っているのですがそのとおりにやっても文字化けするところか エラーでテストランできないです。 たとえば、デバッグ用にダイアログを表示させる方法として { char szBuf[256] wsprintf(szBuf, "x= %d",x); MessageBox(hWnd,szBuf,"Debug",MB_OK); } というものがのっているのですがとりあえず 「空のプロジェクト」を選択しないで普通に動く状態で実行させてみても「型が違うのでキャストしろ」というメッセージが出ます。 それでキャストするとエラーは出ないのですが文字化けします。 もっと簡単に { MessageBox(hWnd,"文字","Debug",MB_OK); } とかしてもやっぱり文字化けします。 しかしなぜか文字列に1から9を指定したときはそのまま表示されます。 10以上は容赦なく文字化けします。 参考書のほうはVS C++.NETを対象としているそうなのですがそのせいかもしれません。 どなたかわかる方よろしくお願いします。

  • ドロップで起動するけどパスは?

    ファイルをEXEにドロップして起動させます。 ドロップしたファイルのパスを GetCommandLine( ) から 取り出すために、" の位置を調べます。 "EXEのパス" ドロップファイルのパス となっているから、2番目の " の位置を調べました。 でも、for でのループが1回で終わってしまいます。 おかしいところを教えてください。 LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) {  char *p = GetCommandLine();  char str[200];  switch(msg){  case WM_CREATE:   int i;   for(i = 1; p[i] == '"'; i++);{    wsprintf(str, "%d", p[i]);    MessageBox(hWnd, chStr, "", MB_OK);   }   wsprintf(chStr, "%d", i);   MessageBox(hWnd, str, "", MB_OK); //結果は1   wsprintf(chStr, "%#x", p[0]);   MessageBox(hWnd, str, "1文字目", MB_OK); //結果は34   wsprintf(chStr, "%#x", p[1]);   MessageBox(hWnd, str, "2文字目", MB_OK); //結果は67   wsprintf(chStr, "%#x", p[2]);   MessageBox(hWnd, str, "3文字目", MB_OK); //結果は58

  • デバッグについて教えてください

    よろしくお願いします。 サンプルのソースを参考にして、『メモ帳』を作成しています。 プログラムの記述間違いや、コンパイル時のエラーは無いのですが、 出来上がった『メモ帳』に何かを書くと、いきなり 『文書保存の確認部分のメッセージ』が表示され、 ×ボタンで閉じようとすると、こんどは『上書き保存の部分のメッセージ』が表示されます。 こちらも閉じようとして、×ボタンを押すと再び、『上書き保存の部分』の表示となり、いつまでも繰り返します。 そこで、 { char szBuf[256]; wsprintf(szBuf, "x = %d, x"); MessageBox(hWnd, szBuf, "Debug", MB_OK); } と言うメッセージボックスを、『新規作成、ファイルを開く、文書保存の確認、上書き保存などの、各、関数部分に』挿入してデバッグしたのですが、何の変化もありません。 デバッグの方法に間違いがあると思うのですが不慣れなため気づきません。 詳しい方、アドバイスをお願いします。

  • wsprintf( ) でポインタに代入

    wsprintf(p, "%d" , i); を書いたせいで、i の値が変わります。 wsprintf(p, "%d" , i); によってどんなことが起こっているのか詳しく知りたいです。 ポインタのことがまだよく分かってないんです。 #include <windows.h> LPCSTR szStr = "\n char c[255];\n char *p = \"\\0\";\n int i = 12345;\n\n switch (msg){\n case WM_LBUTTONDOWN:\n  wsprintf(c, \"%d\" , i);\n  wsprintf(p, \"%d\" , i);\n  MessageBox(hWnd , c , \"\" , MB_OK);\n break;"; LRESULT CALLBACK WndProc(HWND , UINT , WPARAM , LPARAM); int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE , LPSTR , int){ 省略 return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wParam , LPARAM lParam){ HDC hDC; PAINTSTRUCT ps; RECT rt; char c[255]; char *p = "\0"; int i = 12345; switch (msg){ case WM_LBUTTONDOWN: wsprintf(c, "%d" , i); wsprintf(p, "%d" , i); MessageBox(hWnd , c , "" , MB_OK); break; case WM_PAINT: GetClientRect(hWnd, &rt); hDC = BeginPaint(hWnd, &ps); DrawText(hDC, szStr, lstrlen(szStr), &rt, DT_WORDBREAK); EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return(DefWindowProc(hWnd , msg , wParam , lParam)); } return (0L); }

  • HKEY_CLASSES_ROOT\.avi

    [HKEY_CLASSES_ROOT\.avi] @="avifile" "Content Type"="video/x-msvideo" の2つの値をメッセージボックスに表示するソースを教えてください。 HKEY hKey; RegOpenKeyEx(HKEY_CLASSES_ROOT, ".avi", 0, KEY_READ, &hKey); wsprintf(str1, "%", ); MessageBox(hWnd, str1, "標準の値", MB_OK); wsprintf(str2, "%", ); MessageBox(hWnd, str2, "コンテンツタイプの値", MB_OK); RegCloseKey(hKey);

  • レジストリの読み込み

    レジストリの読み込みのソースを教えてください。 例えば、 [HKEY_CLASSES_ROOT\.avi] @="avifile" "Content Type"="video/x-msvideo" の2つの値をメッセージボックスに表示するソースを教えてください。 HKEY hKey; RegOpenKeyEx(HKEY_CLASSES_ROOT, ".avi", 0, KEY_READ, &hKey); wsprintf(str1, "%", ); MessageBox(hWnd, str1, "標準の値", MB_OK); wsprintf(str2, "%", ); MessageBox(hWnd, str2, "コンテンツタイプの値", MB_OK); RegCloseKey(hKey);

  • エラー Run-Time Check Failure #2 - Stack around the variable 'ps' was corrupted.

    五目並べのプログラムを作っているのですが、 下記2のサブルーチンを出る時に 下記1のようなランタイムエラーが どうしても出てしまいます。 原因が分からなく自分の力ではどうにもできないので、 どなたかアドバイスよろしくお願い致します。        記1 Run-Time Check Failure #2 - Stack around the variable 'ps' was corrupted.        記2 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { int id, x, y; static int nTe = 0; PAINTSTRUCT ps; HDC hdc; char szBuf[64], szSashite[16]; static HMENU hMenu; switch (msg) { case WM_CREATE: hMenu = GetMenu(hWnd); break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); MyMakeBan(hdc); MyStoneDraw(hdc); if (bSente) strcpy_s(szSashite, "先手●"); else strcpy_s(szSashite, "後手○"); wsprintf((LPWSTR)szBuf, TEXT("差し手 = %s"), szSashite); TextOut(hdc, 30, SHUI + KANKAKU * 14 + 30, (LPCWSTR)szBuf, strlen(szBuf)); wsprintf((LPWSTR)szBuf, TEXT("第 %02d 手終了 現在 %02d 手目待ち"), nTe, nTe + 1); TextOut(hdc, 30, SHUI + KANKAKU * 14 + 50, (LPCWSTR)szBuf, strlen(szBuf)); EndPaint(hWnd, &ps); break;

  • 16進数の表示ができません。

    シリアルポートで受信したバイナリデータを表示させると、 正しい値が出ないのですが、どうしてでしょうか? 受信するデータは16進数で 06 02 81 07 00 bb 01 b4 00 32 なのですが、以下のソースで実行すると、 6 2 ffffff80 7 0 ffffffbb 1 ffffffb4 0 32 と表示されました。 また、「データ受信完了」というメッセージが出ないのですが、 出なくてもデータ受信は出来ているのでしょうか? char szBuf[256]; char rdBuf[10]; char* prdBuf; DWORD dwCount; DWORD dwRead; dwCount = 10; prdBuf = &rdBuf[0]; if(ReadFile(hCom,prdBuf,dwCount,&dwRead,&old) == 0){ if(ERROR_IO_PENDING == GetLastError()){ if(WaitForSingleObject(hEvent,INFINITE); == WAIT_OBJECT_0){ if(GetOverlappedResult(hCom,&old,&dwCount,TRUE)) MessageBox("データ受信完了"); } } else MessageBox("データ受信エラー","試作1",MB_ICONSTOP); } wsprintf(szBuf,"文字 = %x %x %x %x %x %x %x %x %x %x", rdBuf[0],rdBuf[1],rdBuf[2],rdBuf[3],rdBuf[4],rdBuf[5],rdBuf[6],rdBuf[7],rdBuf[8],rdBuf[9]); MessageBox(szBuf); よろしくお願いします。

  • 1と表示させたいが12と表示される

    windows XP VC++.net 2003です。 よろしくお願いします。 症状は毎回コピーアンドペーストでプログラムを書くよりも 関数化してソースをきれいにしようと思い BOOL ButtonNumber (int bNumber,HWND hWnd) { long z; char sBuff[100]; char number[100]; wsprintf(number,"%d",bNumber); z = GetWindowText(GetDlgItem(hWnd,IDC_EDIT1),sBuff,99); if(z == 0){ SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),number); return TRUE; } if(z == 10){ //桁数が多すぎる警告メッセージ MessageBox(NULL,"桁数が多すぎます。","警告",MB_OK); return TRUE; } z = atol(sBuff); wsprintf(sBuff,"%d1",z); SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),sBuff); return TRUE; } という関数を作りました。 numberに1という数字が入っていてエディットボックスに1と表示されるはずなのですが12と表示されてしまいます。 ためしにnumberに12と入れてみると表示されるのが122 123と入力すると1232と表示されてしまいます。 SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),number); どこも間違っていないように思いますが・・なんででしょう・・ 関数化せずmainに直接書き込んでいけば正常に1と表示されます・ switch (LOWORD(wParam)) { case IDC_BUTTON1: ButtonNumber(1,hWnd); case IDC_BUTTON2: a = GetWindowText(GetDlgItem(hWnd,IDC_EDIT1),sBuff,99); if(a == 0){ SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),"2"); return TRUE; } if(a == 10){ //桁数が多すぎる警告メッセージ MessageBox(NULL,"桁数が多すぎます。","警告",MB_OK); return TRUE; } a = atol(sBuff); wsprintf(sBuff,"%d2",a); SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),sBuff); return TRUE; この場合BUTTON1は12と意図しない表示をしますが BUTTON2はちゃんと2と表示されます。 非常に困っていますよろしくお願いします。

専門家に質問してみよう