2016-08-14 2 views
2

я пытался запустить некоторые C код (ниже):Я не могу выйти из этого цикла, даже после нажатия у или нет

#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"); 
} 

я не знаю реальную проблему, но это не вылезая цикла. И еще одно: когда я нажимаю любой символ «y» или «n» или любой символ, он печатает приглашение два раза или сколько символов я ввожу в него Пожалуйста, если кто-то может сэкономить минуту и ​​сказать мне, где я я ошибаюсь, было бы благодарно. Спасибо

Выход: Output of the above code(Sorry for the link)

+2

Если вы нажмете n, опция! = Y верна. Таким образом, опция всегда будет не равна y или n –

+5

Что вы действительно хотите: '(option! = 'Y') && (option! = 'N')'. Ваше текущее состояние всегда верно. – Arnauld

+0

@Suraj: можете ли вы принять один из ответов, нажав на серое галочку под его счетом? – chqrlie

ответ

2

условие в while ((option != 'y') || (option != 'n')) всегда верно.

Вы должны написать этот тест так:

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

Обратите внимание, что если вы дойдете до конца входного потока, fgetc() будет всегда возвращать EOF и цикл будет выполняться бесконечно. Исправьте это, также тестирование на EOF:

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

Причины вы получите несколько ответов на один вход является stdin является линией буферным, так что вам нужно ввести enter, чтобы программа могла получить вход. Это делает полную строку символов доступной для программы, включая трейлинг-линию.

Нет портативного способа отключить эту буферизацию линии, поскольку она фактически выполняется терминалом.

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. После De Morgan's Law этого (согласно 1)

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

    он такой же, как

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

Вставка 3 в 2 приводит к

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

, который является таким же, как

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

Вы хотите оставить петлю, если option равно y и n в то же время. Это, очевидно, никогда не будет. :-)

Смежные вопросы