Кажется, в вашем коде есть классическая логическая ошибка. Мне тоже понадобилось время, чтобы поймать это, потому что использование или (||
), кажется, имеет смысл. В этом случае, однако, если вы думаете об этом, компьютер правильно выполняет ваши инструкции и никогда не позволяет вам выйти из цикла. На самом деле вы имеете в виду, что если ваш ввод отличается от 'R' и (&&
) 'r' и 'P' и 'p' ... это недопустимо.
В другой, не связанной теме, вероятно, хорошей идеей будет всегда проверять возвращаемое значение вызовов вашей входной функции. В этом случае вы можете написать что-то вроде
while (1) { /* infinite loop */
printf("\nEnter (r)ock, (p)aper, or (s)cissors. Enter (q) to quit.");
if (scanf(" %c", &c) != EOF) {
if (c == 'q' || c == 'Q') {
break;
} else if (c == 'r' || c == 'R') {
/* rock */
} else if (/* paper, etc... */) {
/* ... */
} else {
/* you can say here that the input is not valid */
}
} else {
printf("\nBye!\n");
break;
}
}
В качестве бонуса, если вы используете * NIX терминал (например, Linux или BSD), вы сможете выйти из цикла, набрав Ctrl-D (^ D), что заставит scanf вернуть EOF , Не забывайте всегда быть очень осторожным, если вы когда-нибудь напишите бесконечный цикл (такой как цикл while (1) в моем примере). Вам придется предоставить какой-нибудь способ выбраться из этих петель.