猫でもわかるWindowsプログラミング第3版の5.2タイピングソフトのプログラムなのですが、
本のプログラムをそのまま書くと、タイプミス!の分岐にはいらないんですが、これは本が間違ってるんでしょうか?
付属のCD-ROMのプログラム(本の方とは少し違う)は正しく動いているようですが、
本に書いてある方がなぜ上手くいかないのかが理解できません。
もし本が間違えているなら、どこが間違っているのか教えていただけると助かります。
下のコードは本に書いてあった方のウィンドウプロージャ部を写したものです。
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
HDC hdc;
PAINTSTRUCT ps;
MMTIME mm;
switch (msg) {
case WM_CREATE:
srand((unsigned)time(NULL));
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
TextOut(hdc, 0, 0, szMondai, lstrlen(szMondai));
TextOut(hdc, 0, 40, szInput, lstrlen(szInput));
if(bSeikai)
SetTextColor(hdc, RGB(0,0,0));
else
SetTextColor(hdc, RGB(255,0,0));
TextOut(hdc,0,80,szCheck,lstrlen(szCheck));
EndPaint(hWnd, &ps);
break;
case WM_CHAR:
if(wp == VK_SPACE && !bStart) {
bStart = TRUE;
TypeStart(hWnd);
break;
}
if(bStart == FALSE)
return DefWindowProc(hWnd, msg, wp, lp);
if(wp == VK_ESCAPE) {
lstrcpy(szMondai, TEXT(""));
lstrcpy(szInput, TEXT(""));
lstrcpy(szCheck, TEXT(""));
InvalidateRect(hWnd, NULL, TRUE);
bStart = FALSE;
break;
}
wsprintf(szInput, TEXT("あなたの入力=\"%c\""), (int)wp);
if(szMondai[6] == szInput[14]) {
bSeikai = TRUE;
mm.wType = TIME_MS;
timeGetSystemTime(&mm, sizeof(MMTIME));
dwEnd = mm.u.ms;
wsprintf(szCheck, TEXT("反応時間[%dミリ秒]"),
dwEnd - dwStart);
TypeStart(hWnd);
} else {
bSeikai = FALSE;
MessageBeep(MB_OK);
lstrcpy(szCheck, TEXT("タイプミス!"));
}
InvalidateRect(hWnd, NULL, TRUE);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, msg, wp,lp));
}
return 0;
}
int TypeStart(HWND hWnd)
{
int n;
MMTIME mm;
n = rand() % 26;
wsprintf(szMondai, TEXT("問題=\"%c\""), 'a' + n);
mm.wType = TIME_MS;
timeGetSystemTime(&mm, sizeof(MMTIME));
dwStart = mm.u.ms;
InvalidateRect(hWnd, NULL, TRUE);
return 0;
}
No.3ベストアンサー
- 回答日時:
この本持ってます。
たしかこれは文字の数え方が間違っていました。
if(szMondai[6] == szInput[14])
を
if(szMondai[4] == szInput[8])
としてみて下さい。
UNICODEは1バイト文字も2バイト文字も1文字として数えます。
(例題では2バイト文字を2文字として数えている。)
というかそもそも文字列の中の1文字を比較するのが間違いだと思います。
TypeStartの中のnをszMondaiなどと同じくグローバルで宣言し、
if(n+'a' == (int)wp)
などにすると間違えにくいのでは。
どうやら文字セットが間違っていたようですね・・・
UNICODEからマルチバイト文字セットに変更してみたら成功しました!
ありがとうございました
No.2
- 回答日時:
と言うか、この手の「特定の書籍」に関する質問は、作者に連絡するとか、サポートサイトを訪れてみる方が確実ですよ。
公式サイトは以下のようで、
猫でもわかるプログラミング:
http://homepage2.nifty.com/c_lang/
一番下に作者へのE-mailのリンクがありますから、著者に伺った方が確実だと思いますよ。
No.1
- 回答日時:
if(szMondai[6] == szInput[14]) {
を
if(szMondai[8] == szInput[16]) {
にするかまたは
wsprintf(szInput, TEXT("あなたの入力=\"%c\""), (int)wp);
を
wsprintf(szInput, TEXT("あなたの入力=%c"), (int)wp);
wsprintf(szMondai, TEXT("問題=\"%c\""), 'a' + n);
を
wsprintf(szMondai, TEXT("問題=%c"), 'a' + n);
にすればいいかも
それとwsprintf( )使うならTEXT(" ")ではなくてL" "にすべきかな
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- JavaScript jsで、switch文で書かれた分をif文にできませんか。 1 2022/07/28 15:10
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL php テーブルを作れない 2 2022/11/17 18:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【Windowsアプリ】ファイルのド...
-
ダイアログプログラムでEnterキ...
-
C言語win32api、エディットボッ...
-
ウィンドウのサイズ変更について
-
DirectShowを用いたmpgファイル...
-
アイコンを左上に表示したい
-
Win32APIでアイコンファイルを...
-
ボタンの色(WINAPI)
-
音量調節
-
Win32APIでウィンドウを中央に...
-
ツリーコントロールの開閉アイ...
-
Enterキーを押されたら次の処理...
-
数字以外が入力されたらエラー...
-
「指定されたキャストは有効で...
-
fgetsなどのときのstdinのバッ...
-
マイナスからプラスへ転じた時...
-
2÷3などの余りについて
-
複数桁10進数の*桁目だけを抽出...
-
*をユーザーが入力した数字の数...
-
#define _CRT_SECURE_NO_WARNIN...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エディットボックスの背景の色...
-
ダイアログプログラムでEnterキ...
-
C言語win32api、エディットボッ...
-
音量調節
-
エディットコントロール入力時...
-
プログラミングでエラーが出ま...
-
エラー Run-Time Check Failur...
-
キャレットの現在位置の表示 (W...
-
LoadImageとSetCursorについて
-
コンソールアプリケーションの...
-
画像を表示したいのですが……
-
ボタンの色(WINAPI)
-
COMPORTマルチスレッドで例外発生
-
C++のcase文の書き方
-
Win32APIでウィンドウを中央に...
-
PeekMessageについて
-
CTreeCtrlのCreate関数でエラー...
-
オーバーレイみたいな処理がしたい
-
この列挙体でsysjanの関数はあ...
-
DirectInputについて再
おすすめ情報