ページ 11

正しく入力できないのです

Posted: 2010年10月09日(土) 15:24
by きのこのこのこ
生年月日を入力してそれをメッセージボックスで表示するプログラムなのですが、正しく入力できないことがあります
月で1桁の月を入力した時に日が1桁しか入力できなかったり、1桁の日を入力した時に年齢が1桁しか入力できなくなってしまいます
1桁入力するときに01とすると次も2桁入力できるみたいですが、そのようなことをしなくても2桁入力できるようにしたいと思っています
私は高校でC言語を学んでいる最中ですが、WindowsCはまだ数ヶ月しか学んでいません
生年月日や年齢を使って占いのようなものを作り、文化祭で発表しようと思ってますのでどうかよろしくお願いします
見落としておりました、申し訳ありません
http://detail.chiebukuro.yahoo.co.jp/qa ... 1148365286
Yahoo知恵袋でも質問しておりますが、どうかよろしくお願いします


LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
static int check = 0 , sFlag = 0 , century , month , day , age;
int id , len = 0;
static char str[12];
char outstr[300] , mes_str[256] , mes_str2[256];
HDC hdc;
PAINTSTRUCT ps;

switch(msg){
case WM_CREATE:
memset(str , 0 , sizeof(str));
memset(outstr , 0 , sizeof(outstr));
memset(mes_str , 0 , sizeof(mes_str));
break;
case WM_CHAR:
len = strlen(str);
if(wp == VK_RETURN && len != 0){
memset(str , 0 , sizeof(str));
sFlag++;
}
str[len] = wp;
if(sFlag == 0){
century = atoi(str);
}
if(sFlag == 1){
month = atoi(str);
}
if(sFlag == 2){
day = atoi(str);
}
if(sFlag == 3){
age = atoi(str);
}
InvalidateRect(hWnd , NULL , TRUE);
break;
case WM_PAINT:
hdc = BeginPaint(hWnd , &ps);
wsprintf(mes_str , "初めに誕生年を入力してくださ

い");
TextOut(hdc , 300 , 20 , mes_str , (int)strlen

(mes_str));
if(century != 0){
wsprintf(outstr , "年:%d" , century);
TextOut(hdc , 385 , 40 , outstr , (int)

strlen(outstr));
}
if(sFlag > 0){
memset(mes_str , 0 , sizeof(mes_str));
wsprintf(mes_str , "続いて誕生月を入力し

てください");
TextOut(hdc , 300 , 60 , mes_str ,

(int)strlen(mes_str));
if(month != 0){
wsprintf(outstr , "月:%d" ,

month);
TextOut(hdc , 395 , 80 , outstr

, (int)strlen(outstr));
}
}
if(sFlag > 1){
memset(mes_str , 0 , sizeof(mes_str));
wsprintf(mes_str , "続いて誕生日を入力し

てください");
TextOut(hdc , 300 , 100 , mes_str ,

(int)strlen(mes_str));
if(day != 0){
wsprintf(outstr , "日:%d" ,

day);
TextOut(hdc , 395 , 120 , outstr

, (int)strlen(outstr));
}
}
if(sFlag > 2){
memset(mes_str , 0 , sizeof(mes_str));
wsprintf(mes_str , "最後に現年齢を入力し

てください");
TextOut(hdc , 300 , 140 , mes_str ,

(int)strlen(mes_str));
if(age != 0){
wsprintf(outstr , "年齢:%d" ,

age);
TextOut(hdc , 385 , 160 , outstr

, (int)strlen(outstr));
}
}
if(sFlag > 3){
memset(mes_str , 0 , sizeof(mes_str));
if(month < 1 || month > 12){
strcat(mes_str , "1年はは1~12月

までです\n");
check = 1;
}
if(month == 4 || month == 6 || month ==

9 || month == 11){
if(day < 1 || day > 30){
wsprintf(mes_str2 , "%d

月は1~30日までです\n" , month);
strcat(mes_str ,

mes_str2);
check = 1;
}
}
if(month == 1 || month == 3 || month ==

5 || month == 7 || month == 8 || month == 10 || month == 12){
if(day < 1 || day > 31){
wsprintf(mes_str2 , "%d

月は1~30日までです\n" , month);
strcat(mes_str ,

mes_str2);
check = 1;
}
}
if(check == 0){
wsprintf(mes_str , "%d年%d月%d日生まれ %d歳" , century ,

month , day , age);
}
id = MessageBox(hWnd , mes_str , "確認"

, MB_YESNO | MB_ICONQUESTION);
if(id == IDNO){
sFlag = 0;
}
}
EndPaint(hWnd , &ps);
break; 画像

Re:正しく入力できないのです

Posted: 2010年10月09日(土) 15:48
by softya
同じ人でよね?
http://detail.chiebukuro.yahoo.co.jp/qa ... 1148365286
マルチポストですので、利用規約を読んでいただいて相互リンクをお願いします。
http://dixq.net/board/board.html

Re:正しく入力できないのです

Posted: 2010年10月09日(土) 16:34
by みけCAT
case WM_CHAR: 
            len = strlen(str); 
            if(wp == VK_RETURN && len != 0){ 
                memset(str , 0 , sizeof(str)); 
                sFlag++; 
            } 
            str[len] = wp; 
            if(sFlag == 0){ 
                century = atoi(str); 
            } 
            if(sFlag == 1){ 
                month = atoi(str); 
            } 
            if(sFlag == 2){ 
                day = atoi(str); 
            } 
            if(sFlag == 3){ 
                age = atoi(str); 
            } 
            InvalidateRect(hWnd , NULL , TRUE); 
            break;
のところを
case WM_CHAR: 
            len = strlen(str); 
            str[len] = wp;/*この行の位置を移動する*/
            if(wp == VK_RETURN && len != 0){ 
                memset(str , 0 , sizeof(str)); 
                sFlag++; 
            }  
            if(sFlag == 0){ 
                century = atoi(str); 
            } 
            if(sFlag == 1){ 
                month = atoi(str); 
            } 
            if(sFlag == 2){ 
                day = atoi(str); 
            } 
            if(sFlag == 3){ 
                age = atoi(str); 
            } 
            InvalidateRect(hWnd , NULL , TRUE); 
            break;
としてみてください。

Re:正しく入力できないのです

Posted: 2010年10月09日(土) 16:42
by softya
みけCATさん、利用規約を守らていない場合には回答を控えていただいたほうが後々の為になると思います。無意味にDixq (管理人)さんがマルチポストに付いて利用規約に書かれているわけではないので。

Re:正しく入力できないのです

Posted: 2010年10月09日(土) 16:43
by みけCAT
どうしてできなかったかを解説します。
(想像なので間違っているかもしれません。)
最初、str配列はこうなっています。
00 00 00 00 00 00 00 00 00 00 00 00
「1」を押すとこうなります。
31 00 00 00 00 00 00 00 00 00 00 00
ここでEnterを押したとします。
まず
len = strlen(str);
により、len=1になります。
次に、
if(wp == VK_RETURN && len != 0){ 
    memset(str , 0 , sizeof(str)); 
    sFlag++; 
}
のところで
00 00 00 00 00 00 00 00 00 00 00 00
となります。
そして、
str[len] = wp;
のところで、len=1なので
00 0D 00 00 00 00 00 00 00 00 00 00
となります。
「1」を押すと
31 0D 00 00 00 00 00 00 00 00 00 00
となります。
もう一度「1」を押すと、strlen(str)==2なので
31 0D 31 00 00 00 00 00 00 00 00 00
となります。
これをatoiに掛けると、0Dのところで解析が止まり、1になるのだと思います。
同じ理由で、現状のプログラムで2桁入力すると、次に3桁以上は入力できないと思います。

Re:正しく入力できないのです

Posted: 2010年10月09日(土) 16:46
by みけCAT
ついでにバッファオーバーラン対策もした方がいいと思います。
case WM_CHAR: 
            len = strlen(str); 
            if(len<11)str[len] = wp;/*終端のnull文字も含めて要素数-1*/
            if(wp == VK_RETURN && len != 0){ 
                memset(str , 0 , sizeof(str)); 
                sFlag++; 
            }  
            if(sFlag == 0){ 
                century = atoi(str); 
            } 
            if(sFlag == 1){ 
                month = atoi(str); 
            } 
            if(sFlag == 2){ 
                day = atoi(str); 
            } 
            if(sFlag == 3){ 
                age = atoi(str); 
            } 
            InvalidateRect(hWnd , NULL , TRUE); 
            break;
softyaさん
きのこのこのこさんは、規約違反だと言われたらちゃんと直されたので、それでいいと私は思いました。

Re:正しく入力できないのです

Posted: 2010年10月09日(土) 16:48
by softya
>きのこのこのこさんは、規約違反だと言われたらちゃんと直されたので、それでいいと私は思いました

申し訳ないですね。見落としておとました。
きのこのこのこさん、みけCATさん、失礼しました。

Re:正しく入力できないのです

Posted: 2010年10月10日(日) 09:00
by きのこのこのこ
ご迷惑おかけして申し訳ありませんでした
解決致しました。ありがとうございました