• 締切済み

エラーのチェックについて

1~10の数字以外が出たら、再入力を促すようにしたいのですが、上手くいかないので教えてください。 int main(void) { char buf[MAX], moji[MAX]; int n, num; printf("1から10の番号を入力してください:"); while (1) { fgets(buf, MAX, stdin); // 文字列の読み込み n = sscanf(buf, "%d%s", &num, moji); // 文字列から変換 if (num >= 1 && num <= 10 && n == 1) { // 範囲外のエラーチェック break; // 正なら終了 } else { // 間違っていたら入力し直し printf("1から10の番号を入力してください:"); } } 以上のようにして、aや11, ctrlキー+zを入力してEnterを押したときは良いのですが、aの後に続けてctrlキー+zを入力してEnterを押したらelseのprintfがずっと出力され続けてしまいます。それ以外に自分で試した入力の中にはエラーは出ませんでした。ctrlキー+zのことを良く理解していないということもあるのかもしれません。

みんなの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#include <stdio.h> #define MAX 16 int main(void){ char buf[MAX], moji[MAX]; char stdinBUFF[BUFSIZ]; int n, num; setbuf(stdin, NULL);//バッファリングを止める do { printf("1から10の番号を入力してください:"); if (fgets(buf, MAX, stdin) == NULL) { clearerr(stdin);//EOF クリア continue; } n = sscanf(buf, "%d%s", &num, moji); if (n<0){ fgets(buf, MAX, stdin);//ゴミ漁り continue; } if (num >= 1 && num <= 10 && n == 1) { break; } }while(1); printf("num:%d\n",num); setbuf(stdin, stdinBUFF);//バッファリングを戻す return 0; }

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.2

Ctrl-Zは、Linux, unix系のshellではサスペンドシグナルに、DOS/Windows系ではEOFとして使われます。 システム依存ですがEOFを入力するとclearerr()でクリアするまで次の入力を受け付けなくなりその現象が起きます。 -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- #include <stdio.h> #define MAX 1024 int main(void) { char buf[MAX], moji[MAX]; int n, num; printf("1から10の番号を入力してください:"); while (1) { if (fgets(buf, MAX, stdin) == 0) { clearerr(stdin); } n = sscanf(buf, "%d%s", &num, moji); if (num >= 1 && num <= 10 && n == 1) { break; } else { printf("1から10の番号を入力してください:"); } } return 0; }

revolution_2005
質問者

お礼

回答有難う御座います。 早速試してみたのですが、適当に文字を入力→続けてctrl-zを入力(abc^zみたいな感じです)→Enterとするとやはりelseのprint文の永続処理になってしまいます。

  • suzukika
  • ベストアンサー率28% (8/28)
回答No.1

こんばんは ロジックはあまりよろしくないので、 σ(^_^)アタシなら簡単に書くと: 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define MAX 10 5 6 int main(void) 7 { 8 char buf[MAX], moji[MAX]; 9 int n, num; 10 printf("Input numbers from 1 to 10:"); 11 while(fgets(buf, MAX, stdin)) 12 { 13 n = atoi(buf); 14 if(n >= 1 && n <=10) 15 { 16 printf("OK\n"); 17 break; 18 } 19 else 20 { 21 printf("Please input number again:"); 22 continue; 23 } 24 } 25 return 0; 26 } となります。 c++なら別の手もありますけどね。

revolution_2005
質問者

お礼

回答有難う御座います。 これだと、ctrl-zを押すと終了してしまいますよね?終了しないで、尚且つ永続処理をなくしたいのですが・・・。

関連するQ&A