Помогите с функцией getch()

Я хочу использовать функцию getch для получения символа... Таким образом, пользователь может ввести только символ Y или N... но цикл while не работает... Мне нужна помощь! Спасибо

#include <stdio.h>
main(){
   char yn = 0; 
   printf("\n\t\t  Save changes? Y or N [ ]\b\b");
   yn = getch();
   while (yn != 'Y' || yn != 'y' || yn != 'N' || yn != 'n') {   //loop is not working
         yn = getch();
   }  
   if (yn=='Y' || yn=='y') printf("Yehey"); 
   else printf("Exiting!");  
   getch();
}

person newbie    schedule 02.12.2010    source источник
comment
Было бы полезно объяснить, как это не работает, или какие усилия вы предприняли для решения этой проблемы.   -  person wj32    schedule 02.12.2010
comment
выражение x != A || x != B всегда будет истинным. x имеет только одно значение :)   -  person ruslik    schedule 02.12.2010


Ответы (4)


yn != 'Y' || yn != 'y' || yn != 'N' || yn != 'n'

Вам нужно использовать && вместо || здесь. Скажем, вы ввели «Y». Таким образом, 1-й тест yn != 'Y' ложен, но 2-й тест yn != 'y' верен. Таким образом, условие истинно, так как они объединены ИЛИ. Вот почему он снова входит в петлю.

person taskinoor    schedule 02.12.2010

Вы имеете в виду &&, а не ||.

Переменная «yn» — это один символ. Чтобы это выражение оценивалось как ложное, этот символ должен быть Y, y, N и n одновременно, что невозможно.

Тебе нужно:

while(yn != 'y' && yn != 'Y' && yn != 'n' && yn != 'N')
person AlastairG    schedule 02.12.2010
comment
И -1 от кого-то еще без видимой причины. Я думаю, что знаю, кто, хотя. - person AlastairG; 02.12.2010

Логика в операторе while ошибочна, вам нужно логическое И (&&) вместо логического ИЛИ (||).

Кроме того, это было бы хорошим местом для использования do { ... } while();

person Neno Ganchev    schedule 02.12.2010

Условием для цикла while является вложенное ИЛИ. Чтобы это работало, вы можете изменить их на AND:

do {
   yn = getch()
} while(yn != 'Y' && yn != 'y' && yn != 'N' && yn != 'n');
person Linus Kleen    schedule 02.12.2010