• ベストアンサー

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と表示されます。 非常に困っていますよろしくお願いします。

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

  • ベストアンサー
  • 64bit
  • ベストアンサー率51% (45/88)
回答No.3

No.2です。ちょっと端折りすぎました。 原因はButtonNumber関数ではなく、 case IDC_BUTTON1のところでbreakしていないので、そのままBUTTON2の部分も実行されて、%d2の「2」が付加されているのでは、ということです。 流し読みなので未検証ですが・・・ 何を意図して「%d1」や「%d2」としているのでしょうか? (本題からそれますが、No.1さんの言うとおりインデントを付けて欲しかったです。また、aやzといった変数名は読みにくいのでやめましょう)

mudai_yeh
質問者

お礼

まさにそのとおりでした。汗 break入ってなかったです汗 電卓プログラムなので押したボタンを後ろにつけるということで%d1などと書いています。 ほかにもスマートな書き方があるようですが・・汗

その他の回答 (2)

  • 64bit
  • ベストアンサー率51% (45/88)
回答No.2

最後の方で、 >wsprintf(sBuff,"%d2",a); この「2」ではないですか?

  • Lbfuvab
  • ベストアンサー率36% (7/19)
回答No.1

見づらいですね。。。 インデントを付けて貰えませんか?(全角空白を使うなどして

mudai_yeh
質問者

補足

インデントつけてたんですが投稿したときスペースが消えました汗。 次回は全角スペースでちゃんとつけます汗

関連するQ&A