2017-02-09 7 views
0

私は1から2を入力して答えから選ぶことができるいくつかのCコードを書いています。また、高い数字を入力すると別の数字を選ぶことができます。しかし、文字列や文字のような数値や数値ではないものを入力しようとすると、一番下のエラーメッセージが無限に繰り返されます。他の文字を入力したときに1または2より大きい数字を入力した場合と同じように、コードを同じように動作させるにはどうすればよいですか?ここで私は抽象化された使用コード:このCコードループの作成を中止するにはどうすればよいですか?

#include <stdio.h> 

int a; 

int main(){ 
    b:scanf("%d", &a); 
    if(a==1) 
    { 
     a=0; 
    } 
    if(a==2) 
    { 
     a=0; 
    } 
    else 
    { 
     a=0; 
     printf("\nERROR: Please try again.\n\n"); 
     goto b; 
    } 
} 

EDIT:どうやら戻り値がまだ(scanf関数でスタックしている)、それはそれに戻ります。返り値のscanf()をどうやって取り除くことができますか?

+5

私はこの代わりに、GOTOSのために 'while'ループを使用すると思います。その後、ループからちょうど '中断 'したり、ループを続けるかどうかを決めるフラグを設定したりします。 gotosの正当なユースケースは正当なものよりもはるかに少ないです。 – Carcigenicate

+3

ああ...後藤。ヤック遅すぎる前にこれを行う*正しい方法を学んでください。 –

+2

'fgets'で入力を取得し、入力文字列に' sscanf'を使用すると、ユーザが必要なものを入力しなかった場合、以前の入力文字列を忘れて、やり直すことができます。 OTOH 'scanf'を使うと、拒否された入力はすべて入力バッファに残ります。 **常に**関数の 'scanf'ファミリからの戻り値をチェックします(それが何を意味するのかはmanページを参照してください)。入力データが* nice *であると決して決してしないでください。 –

答えて

-2

何かのように... 注:明らかに999は任意の値です。例を挙げて選んだだけです。

#include <stdio.h> 


int main(){ 
int a = 1; 
while (a != 999){ 
    scanf("%d", &a); 
    if(a==1) 
    { 
    a=0; 
    } 
    if(a==2) 
    { 
    a=0; 
    } 
    else if (a != 999) 
    { 
     a=0; 
     printf("\nERROR: Please try again.\n\n"); 
    } 
} // while() 
} // main() 
+3

'b'はどこに定義されていますか?これはコンパイルされず、私は 'goto'を宣伝するべきではないと思います。 – stevieb

+0

'scanf()'の戻り値もチェックする必要があります。 –

+0

リラックスしてください。落ち着いて。初期のコードをコピーしてすぐに変更したからです。後藤はなくなった。元のソースから2番目の参照を削除することを意味します。 また、これもgotoであるため、例外をスローしません。 :)それについて考えると、例外がスローされ、コードが直接エラー位置にジャンプします。うん、オレ、後藤。 :) – raddevus

-1
#include <stdio.h> 

int a; 

int isNumeric(const char *str) 
{ 
    while(*str != '\0') 
    { 
     if(*str < '0' || *str > '9') 
      return 0; 
     str++; 
    } 
    return 1; 
} 

int main(){ 

    char inputStr[10]; 
    while(1){ 
     scanf("%9s",inputStr); 
     if(!isNumeric(inputStr)){ 
      a=0; 
      printf("\nERROR Not a number: Please try again.\n\n"); 
     }else { 
      a = atoi(inputStr); 
      if(a==1){ 
       a = 0; 
      }else if(a == 2){ 
       a == 0; 
      }else{ 
       a=0; 
       printf("\nERROR : Please try again.\n\n"); 
      } 
     }`enter code here` 
    } 
} 

テストしていません。しかし、私はあなたが良いアイデアを得るだろうと思う。 strtol関数をチェックしてください。それも便利です。

+2

おそらく 'scanf("%9s "、inputStr)'と 'isdigit'の使用 –

+1

...そして' scanf() 'からの戻り値をテストして値が得られることを確認してください。 –

+0

完了ボス:)。 BTW私はisdigitは、whileループと同じ回数だけループする必要があると思います。だから私はパフォーマンスの問題がないだろうと思う。乾杯:: – vk3105

-1

gotosはまったく使用しないでください。代わりにwhileループを使用してください:

#include <stdio.h> 

int main(void) { 
int a, end = 1; //end determines if the loop should end 
do { //a do-while loop - it's the same as a while loop, except it runs atleast once 
    scanf("%d", &a); 
    switch (a) { //switches the value of a 
    case 1: 
    case 2: printf("You entered %d\n", a); 
      end = 0; //sets end to 0, which will end the loop(see below) 
      break; 
    default: printf("\nERROR: Please try again.\n\n"); 
    } 
} while (end); //every non-zero value is true, so when I set end to 0, it will end the loop 
return 0; //don't forget the return 0: it shows you that your program ran without error 
} 

したがって、有効な入力を入力するとすぐに終了します。また、ループを実行するたびに再度読み取るので、aをゼロに設定する必要はありません。
EDIT:無効な入力など5xをチェックしたい場合は、あなたが使用することができます以下

int check, var, error; 
char ch; 
do { 
error = 0; 
check = scanf("%d%c", &var, &ch); 
if (check != 2 || ch != '\n') { 
    printf("Wrong input. Try again -> "); 
    error = 1; 
    fflush(stdin); 
} 
} while (error); 
+1

おそらく、 'scanf'からの戻り値を調べると、 –

+0

ifステートメントが行うときに' switch'が過剰です –

関連する問題