Остановите цикл while, если условие не выполняется - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь добавить цикл while внутри программы. После его выполнения он должен спросить вас, хотите ли вы продолжить, и наберите «y», если вы это делаете, и «n», если вы этого не сделаете. Если они это сделают, это должно начаться снова, а если нет, то остановится.

Дело в том, что я хотел сделать сообщение всплывающим, если кто-то вводит что-то другое, а не "y" или "n", чтобы потребовать от него этого. Проблема заключается в том, что цикл while будет выполняться во все, что они пишут.

char cnd[100];

while(cnd[0] != 'n') {

    printf("Program executing\n");

    printf("Would you like to launch the program again? If not then type in 'n', if you do then type in 'y': ");
    scanf("%s", &cnd);

    while(cnd[0] != 'n' || cnd[0] != 'y') {
        printf("You have to type in either 'y' or 'n':");
        scanf("%s", &cnd);
    }

}

return 0;

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

Ответы [ 5 ]

0 голосов
/ 08 января 2019

Прежде всего: почему вы читаете строку, когда вам нужен один символ? Используйте getchar (). Затем проверьте, есть ли другой мусор после этого символа в потоке, и действуйте соответственно: Сообщение об ошибке, очистка stdin:

#include <stdbool.h>
#include <ctype.h>
#include <stdio.h>

void clear(FILE *stream)
{
    int ch;
    // eat everything until a newline or EOF is encountered:
    while ((ch = fgetc(stream)) != EOF && ch != '\n');
}

bool only_whitespace(FILE *stream)
{
    int ch;
    // eat all whitespace until a newline or EOF is encountered:
    while ((ch = fgetc(stream)) != EOF && isspace((char unsigned)ch) && ch != '\n');
                                                // ^^^^^^^^^^^^^^ don't pass signed values
                                                // to the functions from <ctype.h>
    if (ch == '\n') {  // when the last character read was a newline
        ungetc(ch, stream);  // put it back into the stream
        return true;         // and tell the caller that all we encountered
    }                        // was whitespace
    return false;
}

int main(void)
{
    int again;

    do {
        puts("Program executing\n");

        while (printf("Would you like to launch the program again? If not then type in 'n', if you do then type in 'y': "),
               (again = getchar()) != EOF && again != 'y' && again != 'n' || !only_whitespace(stdin))
        {
            fputs("Input error!\n\n", stderr);
            if (again != '\n')  // when the character read was not a newline
                clear(stdin);   // there could be other garbage left in the stream
        }
        clear(stdin);

    } while (again == 'y');

    // return 0;  // Since C99 (i think) the effect of execution reching the end of main() without
                  // encountering a return-statement is the same as return 0; (same in C++)
}
0 голосов
/ 08 января 2019

читать то, что вы написали (как код, а не как английский)

while(cnd[0] != 'n' || cnd[0] != 'y') {

если cnd [0] = 'n', то нет = 'y' и наоборот.

Вы имеете в виду

while(cnd[0] != 'n' && cnd[0] != 'y') {

т.е. дать ошибку, это не п и не у

0 голосов
/ 08 января 2019

ваш цикл while проверяет, является ли он у или нет, но один из них всегда верен, попробуйте вместо этого

while(cnd[0] != 'n' && cnd[0] != 'y') {
0 голосов
/ 08 января 2019

Условие cnd[0] != 'n' || cnd[0] != 'y' равно всегда верно. Вы хотели использовать && (логическое и).

Вам также необходимо удалить & из &cnd (при обоих вызовах scanf), так как это приведет к несоответствию спецификатора формата.

Также в самой первой итерации cnd неинициализирован. Вам лучше использовать цикл do ..while или начать cnd с "y", например: char cnd[100] = "y";

Обратите внимание на проблемы с scanf.

0 голосов
/ 08 января 2019

Давайте переведем ваше условие цикла в простой английский:

cnd[0] != 'n' || cnd[0] != 'y'

По сути, вы говорите:

Если первый символ в cnd отличается от n, или , то первый символ в cnd отличается от y, введите цикл.

Это не поддается определению, поскольку cnd[0] всегда будет либо не n, либо не y - это не может быть и то и другое одновременно.

Вместо этого вы должны спросить:

Если первый символ в cnd отличается от n, и , то первый символ в cnd отличается от y, введите цикл.

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