• ベストアンサー

エラー処理

万年カレンダーを作っています。 while(1){ printf(" 西暦年>"); scanf("%d",&year); /*西暦年入力*/ printf("   月>"); scanf("%d",&month); /*月入力*/ if(year>0 && month>0 && month<13){     break; } else{ printf("正しく入力してください\n"); } 上記のように、数字のエラー処理をしたのですが、これに数字以外のモノが入力された場合のエラー処理も追加しなければなりません。

質問者が選んだベストアンサー

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

scanf("%d",&year); の段階で入力文字が数値でない場合はyearに代入されないです scanfの戻り値が0かどうかで判断するのはどうでしょう。

yoro4423
質問者

お礼

ありがとうございました。 scanfの戻り値を利用して、エラー処理解決できました。

yoro4423
質問者

補足

すみません。scanfの戻り値が0かどうか判断するというのはどういうことで、どういうふうにするのですか。初心者なもので、詳しく教えていただけませんか?

その他の回答 (3)

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.4

(意外というかヒネクレ?た「回答」) ★質問者様の最初に示されたソースの「エラー処理」で十分です。 《根拠》    ・scanf( "%d", &year ); で、      例えば、2nd と入力すると、year には 2       、second と入力すると、year は「初期値」のまま  ・たまたま、その「初期値」が正であれば、その「初期値」年の処理。    ・たまたま、その「初期値」が負であれば、「エラー処理」。   なんの不具合もありませんよね。 ----------------------------------------------- (というか) 変数の宣言で、int year = 2008, month = 2; と初期化しておき、 「数字以外のモノが入力された場合」は、2008 年 2 月のカレンダーを《強制的に》作るように「しかけ」を施しておけばいいのでは。 ★それで、思考の重点を「指定年月の朔日の曜日」を求める方に向ける。 ----------------------------------------------- (とはいうものの) >初心者なもので、詳しく教えていただけませんか?  scanf() 等について、参考URLなどで調べましょう。

参考URL:
http://www.bohyoh.com/CandCPP/C/Library/index.html
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★アドバイス >どこがおかしいのでしょうか。  ↑  整数の変数yearに対して文字検査のisdigit()関数を使っているところです。  正しくは文字列の変数yearに対して文字検査を使います。  char year[ 10 ];    scanf( "%s", year );  このようになります。  scanfは『%s』になります。  同様にmanthも文字列で入力できるようにします。 ・文字列の最後は『\0』です。

yoro4423
質問者

補足

ご指摘ありがとうございました。 確かにそうでした。

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

>数字以外のモノが入力された場合のエラー処理も追加しなければなりません。 そうですね。数字範囲チェックより前でチェックしないといけません。 で、何が質問なのでしょうか?補足してください。

yoro4423
質問者

補足

すみません。そうですよね。 数字かどうか判定すればよいから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"); } どこがおかしいのでしょうか。