C - пока цикл не выйдет - PullRequest
       1

C - пока цикл не выйдет

0 голосов
/ 13 сентября 2018

Я создаю код камня, бумаги, ножниц для школьной лаборатории.Я просто пытаюсь проверить наличие недопустимых записей, но я застрял в непрерывном цикле while, несмотря на ввод действительного символа.

printf("\nEnter (r)ock, (p)aper, or (s)cissors. Enter (q) to quit.");
scanf("%c", &input);
if(input=='Q' || input=='q') {
     return 0;
}
while(input!='R' || input!='r' || input!='P' || input!='p' || input!='S' || input!='s' || input!='Q' || input!='q') {
        printf("\nInvalid entry! Please enter (r)ock, (p)aper, or (s)cissors. Enter (q) to quit.");
        scanf(" %c", &input);
}

Буду признателен за любую помощь!

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Кажется, в вашем коде есть классическая логическая ошибка. Мне тоже понадобилось время, чтобы поймать это, потому что использование или (||), кажется, имеет смысл. В этом случае, однако, если вы думаете об этом, компьютер правильно выполняет ваши инструкции и никогда не позволяет вам выйти из цикла. На самом деле вы имеете в виду, что если ваш ввод отличается от '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) в моем примере). Вам придется предоставить какой-нибудь способ выбраться из этих петель.

0 голосов
/ 13 сентября 2018

Вам нужно изменить все операторы OR в цикле while на операторы AND. Если они являются операторами ИЛИ, все входные данные будут истинными.

`

printf("\nEnter (r)ock, (p)aper, or (s)cissors. Enter (q) to quit.");
scanf("%c", &input);
if(input=='Q' || input=='q') {
     return 0;
}
while(input!='R' && input!='r' && input!='P' && input!='p' && input!='S' && input!='s' && input!='Q' && input!='q') {
        printf("\nInvalid entry! Please enter (r)ock, (p)aper, or (s)cissors. Enter (q) to quit.");
        scanf(" %c", &input);
}

`

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...