- ベストアンサー
エラー処理
万年カレンダーを作っています。 while(1){ printf(" 西暦年>"); scanf("%d",&year); /*西暦年入力*/ printf(" 月>"); scanf("%d",&month); /*月入力*/ if(year>0 && month>0 && month<13){ break; } else{ printf("正しく入力してください\n"); } 上記のように、数字のエラー処理をしたのですが、これに数字以外のモノが入力された場合のエラー処理も追加しなければなりません。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
scanf("%d",&year); の段階で入力文字が数値でない場合はyearに代入されないです scanfの戻り値が0かどうかで判断するのはどうでしょう。
その他の回答 (3)
- yama5140
- ベストアンサー率54% (136/250)
(意外というかヒネクレ?た「回答」) ★質問者様の最初に示されたソースの「エラー処理」で十分です。 《根拠》 ・scanf( "%d", &year ); で、 例えば、2nd と入力すると、year には 2 、second と入力すると、year は「初期値」のまま ・たまたま、その「初期値」が正であれば、その「初期値」年の処理。 ・たまたま、その「初期値」が負であれば、「エラー処理」。 なんの不具合もありませんよね。 ----------------------------------------------- (というか) 変数の宣言で、int year = 2008, month = 2; と初期化しておき、 「数字以外のモノが入力された場合」は、2008 年 2 月のカレンダーを《強制的に》作るように「しかけ」を施しておけばいいのでは。 ★それで、思考の重点を「指定年月の朔日の曜日」を求める方に向ける。 ----------------------------------------------- (とはいうものの) >初心者なもので、詳しく教えていただけませんか? scanf() 等について、参考URLなどで調べましょう。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス >どこがおかしいのでしょうか。 ↑ 整数の変数yearに対して文字検査のisdigit()関数を使っているところです。 正しくは文字列の変数yearに対して文字検査を使います。 char year[ 10 ]; scanf( "%s", year ); このようになります。 scanfは『%s』になります。 同様にmanthも文字列で入力できるようにします。 ・文字列の最後は『\0』です。
補足
ご指摘ありがとうございました。 確かにそうでした。
- shimix
- ベストアンサー率54% (865/1590)
>数字以外のモノが入力された場合のエラー処理も追加しなければなりません。 そうですね。数字範囲チェックより前でチェックしないといけません。 で、何が質問なのでしょうか?補足してください。
補足
すみません。そうですよね。 数字かどうか判定すればよいからisdigit関数を使用すればよいと思い、組もうとしたのですが、出来ませんでした。 while(1){ printf(" 西暦年>"); scanf("%d",&year); /*西暦年入力*/ printf(" 月>"); scanf("%d",&month); /*月入力*/ if(isdigit(year)!=0 && isdigit(month)!=0){ if(year>0 && month>0 && month<13){ break; } } else{ printf("正しく入力してください\n"); } どこがおかしいのでしょうか。
お礼
ありがとうございました。 scanfの戻り値を利用して、エラー処理解決できました。
補足
すみません。scanfの戻り値が0かどうか判断するというのはどういうことで、どういうふうにするのですか。初心者なもので、詳しく教えていただけませんか?