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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
きのこのこのこ

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

#1

投稿記事 by きのこのこのこ » 15年前

生年月日を入力してそれをメッセージボックスで表示するプログラムなのですが、正しく入力できないことがあります
月で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; 画像

softya

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

#2

投稿記事 by softya » 15年前

同じ人でよね?
http://detail.chiebukuro.yahoo.co.jp/qa ... 1148365286
マルチポストですので、利用規約を読んでいただいて相互リンクをお願いします。
http://dixq.net/board/board.html

みけCAT

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

#3

投稿記事 by みけCAT » 15年前

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;
としてみてください。

softya

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

#4

投稿記事 by softya » 15年前

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

みけCAT

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

#5

投稿記事 by みけCAT » 15年前

どうしてできなかったかを解説します。
(想像なので間違っているかもしれません。)
最初、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桁以上は入力できないと思います。

みけCAT

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

#6

投稿記事 by みけCAT » 15年前

ついでにバッファオーバーラン対策もした方がいいと思います。
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さん
きのこのこのこさんは、規約違反だと言われたらちゃんと直されたので、それでいいと私は思いました。

softya

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

#7

投稿記事 by softya » 15年前

>きのこのこのこさんは、規約違反だと言われたらちゃんと直されたので、それでいいと私は思いました

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

きのこのこのこ

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

#8

投稿記事 by きのこのこのこ » 15年前

ご迷惑おかけして申し訳ありませんでした
解決致しました。ありがとうございました

閉鎖

“C言語何でも質問掲示板” へ戻る