>

다음 함수가 호출되어 실행될 때 초기 "if"조건이 충족되면 프로그램이 의도 한대로 실행됩니다. 반복적으로. 초기 "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_func ()가 매 실행마다 메모리를 할당하지 않고도 변수에 액세스 할 수 있도록 num 및 yn [1] 전역 변수를 만드는 방법을 찾는 데 관심이 있습니다. 설명해 주시면 감사하겠습니다.

  • 답변 # 1

    여기에 답을 따르십시오. 유효하지 않은 입력 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();
    }
    
    

    두 번째 질문에 관해서는, 함수가 이미 스택 프레임을 무시했을 정도로 공간을 절약하기 위해 전역 변수를 만드는 것은 완전히 불필요합니다. i/o 버퍼가 명확하지 않아서 원하는 경우 num 및 yn [] 전역을 만들었으므로 조건을 입력 할 수없는 경우 scanf를 실행합니다.

    #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();
    }
    
    

관련 자료

  • 이전 cocoa - 바인드 메소드 대체 (swift) - 오류 : 'any'유형의 값에 'addobserver'멤버가 없습니다
  • 다음 전체 화면 안드로이드