2016-08-14 1 views
2

を押した後、このループから抜け出すことができないです:私は、実際の問題を知らないが、それが出てきていない私はいくつかのCコード(下記)を実行しようとしたとしても、Y、または全く

#include <stdio.h> 

int main() 
{ 
    int option; 
    do { 
     printf("Enter either y/n: "); 
     option = fgetc(stdin); 
     printf("\n"); 
    } while ((option != 'y') || (option != 'n')); 

    printf("You Pressed Yes/No\n\n"); 
} 

をループの もう1つのことは、「y」または「n」または任意の文字のいずれかを押すと、2回のプロンプトが表示されるか、何文字入力されるのかです。 瞬時に余裕があり、間違っていると感謝します。ありがとう

出力: Output of the above code(Sorry for the link)

+2

nを押すと、オプション!= yがtrueになります。だから、オプションは常にyまたはnと等しくないでしょう –

+5

本当に欲しいのは '(option!= 'y')&&(option!= 'n')'です。あなたの現在の状態は常に真です。 – Arnauld

+0

@Suraj:スコアの下にある灰色のチェックマークをクリックして回答の1つを受け入れることができますか? – chqrlie

答えて

2

while ((option != 'y') || (option != 'n'))の条件が常に真です。あなたが入力ストリームの終わりに達した場合、fgetc()は常にEOFを返し、ループが無期限に実行することを

while ((option != 'y') && (option != 'n')); 

注:

あなたがこのテストをこのように書く必要があります。またEOFのためにテストすることによってこの問題を解決:

while (option != EOF && option != 'y' && option != 'n'); 

理由はあなたが単一の入力に対して複数の答えを得ることはあなたのプログラムが入力を受け取るようにするenterを入力する必要がありますのでstdinは、ラインバッファリングされています。これにより、行末改行を含めて、プログラムで使用できる完全な行が作成されます。

端末によって実際に実行されるため、この回線のバッファリングをオフにするポータブルな方法はありません。

3

option'y'とは異なり、'n'とは異なります。

opt | opt != 'y' | opt != 'n' | opt != 'y' OR opt != 'n' | opt != 'y' AND opt != 'n' 
------+------------+------------+--------------------------+--------------------------- 
'x' | true | true |   true   |   true 
'y' | false | true |   true   |   false 
'n' | true | false |   true   |   false 
0
  1. あなたはこの条件は下に示した場合は、ループを残したい意味限り

    ((option != 'y') || (option != 'n')) 
    
  2. としてループを続けたい:

    のは、次の真理値表を考えてみましょう図1は、もし

    !((option != 'y') || (option != 'n')) 
    
  3. つまり、真実ではありません
  4. 同じである
    !!((option == 'y') && (option == 'n')) 
    

    から2点のリードに3を挿入

    !((option == 'y') && (option == 'n')) 
    

同じ(1あたりとして)De Morgan's Lawこの

((option != 'y') || (option != 'n')) 

((option == 'y') && (option == 'n') 

したがって、optionyと等しい場合はループを終了し、同時にnとします。明らかにこのことは決して起こりません。 :-)

関連する問題