2017-01-29 15 views
-1

これはなぜ1や0以外の値に対しても常にループする理由は誰も知っていますか?また、文字を入力として与えた場合の無限ループを避けるにはどうしたらいいですか? a!=0a!=1両方が偽である場合論理またはCプログラミング言語

#include <stdio.h> 

int a; 

main() 
{ 
    do 
{ 
    puts("Give 1 or 0 for input:"); 
    scanf("%d",&a); 
} while(a!=0 || a!=1); 

printf("\n%d",a); 
return 0; 

}

+0

あなたの|| && –

+0

1または0に似た値を残して申し訳ありませんが、私は尋ねているものです。 – bazuka

+0

もし私が|| a!= 1 halfまたはa!= 0 ||それはうまく動作します。 – bazuka

答えて

3

ループを終了するための唯一の方法です。つまり、a == 0a == 1が同時に終了することができます。それはもちろん不可能なので、ループは決して終了しません。

あなたは時にユーザー入力1または0終了するためにループにしたい場合は、あなたがそこに論理オペレータを必要とする:

do 
{ 
    puts("Give 1 or 0 for input:"); 
    scanf("%d",&a); 
} while(a!=0 && a!=1); 

それはさておき、あなたが本当にscanfの戻り値をチェックしなければならない、と失敗した場合に入力ストリームをパージします。文字を入力すると、scanfはそれが失敗したことを示しますが、文字は入力ストリームに残ります。それ以降の反復は、その文字を読み込もうとすると固まってしまいます。

scanf自体と%*sのフォーマット指定子を使用する方法があります。

do 
{ 
    puts("Give 1 or 0 for input:"); 
    int read_res = scanf(" %d",&a); 
    if (read_res != 1) 
     scanf("%*s"); 
} while(a != 0 && a != 1); 

フォーマット文字列にアスタリスクがscanfはまだ任意の非空白文字にマッチし、ストリームからそれらを削除、何でも(そう余分なパラメータが必要とされない)にそれらを割り当てるしようとしないだろうことを意味します。数字の前にある先頭の空白を無視するために、先頭の空白を%dに追加しました。

+1

正しい。 'char '入力の場合も、他の問題に対処してください。 –

+0

ありがとう、それは速かった。 – bazuka

関連する問題