Невозможно вызвать функцию, не застревая в бесконечном цикле - PullRequest
0 голосов
/ 28 мая 2019

Когда следующая функция вызывается и запускается, если начальное условие «если» выполнено, программа запускается как задумано; повторно. Если начальное условие «if» не выполнено, программа переходит к выполнению оператора else, но застревает в бесконечном цикле.

Почему?

#include <stdio.h>
#include <string.h>

int num_func();

int main()
{
    num_func();

   return 0;
}

int num_func()
{
    int num;
    char yn[1];

    printf("Please enter an integer value: ");

    if (scanf("%d", &num) == 1)

        {
            printf("The value you entered is: %d. Is this correct? ", num);
            scanf("%s", &yn);

            if (strcmp(yn, "y") == 0) {
                printf("Great! \n");
            }

            else if (strcmp(yn, "n") == 0) {
                printf(":( \n");
            }

            else {
                printf("Illegal Entry. \n");
            }
        }

    else {
        printf("You were told to put in a number!");
    }

    num_func();
}

Мне также интересно узнать, как сделать глобальные переменные num и yn [1], чтобы num_func () мог обращаться к ним без необходимости выделять память при каждом запуске. Если бы вы могли это объяснить, я был бы признателен.

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Проблема здесь заключалась в том, что после ввода в оператор else и запуска scanf, который находится в состоянии if, не может принимать входные данные, потому что буфер ввода / вывода не очищен и по вашему желанию я сделал num и yn [] глобальными.

#include <stdio.h>
#include <string.h>

int num_func();
int num, c;
char yn[1];
int main()
{
    num_func();

    return 0;
}

int num_func()
{

    printf("Please enter an integer value: ");
    fflush(stdin);
    if (scanf("%d", &num) == 1)

        {
            printf("The value you entered is: %d. Is this correct? ", num);
            scanf("%s", &yn);

            if (strcmp(yn, "y") == 0) {
                printf("Great! \n");
            }

            else if (strcmp(yn, "n") == 0) {
                printf(":( \n");
            }

            else {
                printf("Illegal Entry. \n");

            }
        }

    else {
        printf("You were told to put in a number!\n");

    }

    num_func();
}
0 голосов
/ 28 мая 2019

После ответа здесь . При неправильном вводе stdin не будет очищено, поэтому вам нужно очистить его самостоятельно. В противном случае при следующем вызове scanf он увидит, что все еще есть данные для чтения, и попытается снова прочитать недействительные данные.

#include <stdio.h>
#include <string.h>

int num_func();

int main()
{
    num_func();

   return 0;
}

int num_func()
{
    int num, c;
    char yn[1];

    printf("Please enter an integer value: ");

    if (scanf("%d", &num) == 1)

        {
            printf("The value you entered is: %d. Is this correct? ", num);
            scanf("%s", &yn);

            if (strcmp(yn, "y") == 0) {
                printf("Great! \n");
            }

            else if (strcmp(yn, "n") == 0) {
                printf(":( \n");
            }

            else {
                printf("Illegal Entry. \n");
                while ((c = getchar()) != EOF && c != '\n')
                    continue;
            }
        }

    else {
        printf("You were told to put in a number!\n");
        while ((c = getchar()) != EOF && c != '\n')
            continue;
    }

    num_func();
}

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

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