アプリ版:「スタンプのみでお礼する」機能のリリースについて

猫でもわかる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;
}

A 回答 (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)
などにすると間違えにくいのでは。
    • good
    • 0
この回答へのお礼

どうやら文字セットが間違っていたようですね・・・
UNICODEからマルチバイト文字セットに変更してみたら成功しました!
ありがとうございました

お礼日時:2009/10/16 23:42

と言うか、この手の「特定の書籍」に関する質問は、作者に連絡するとか、サポートサイトを訪れてみる方が確実ですよ。


公式サイトは以下のようで、

猫でもわかるプログラミング:
http://homepage2.nifty.com/c_lang/

一番下に作者へのE-mailのリンクがありますから、著者に伺った方が確実だと思いますよ。
    • good
    • 0
この回答へのお礼

そうですね・・・ありがとうございます!

お礼日時:2009/10/16 23:38

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" "にすべきかな

この回答への補足

両方試してみたのですが、だめでした・・・
結果は変わらず、タイプミス!がでませんでした。

補足日時:2009/09/19 17:57
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!