안녕하세요! 왜 무한루프가 발생하는지 알고싶습니다.

조회수 1117회

안녕하세요! c 연습을 하다가 무한루프에 빠져버렸는데 해결을 못하고 있습니다.

상황은 이렇습니다.

1과 10사이의 정수를 받는 경우는 for문을 종료하고 그 이외의 숫자를 받으면 다시 입력받도록 했습니다.

아래는 작성한 코드입니다.

int testcase;
for (;;) {
    testcase = 0;
    printf("enter the number of testcase : ");
    scanf_s("%d", &testcase);
    if (testcase > 10 || testcase < 1) {
        printf("wrong number. please enter a number between 1 and 10 in integer type. \n");
    }
    else {
        break;
    }
}

여기서 문제점은 범위 외의 소수점 자리를 갖는 숫자나 문자 등을 입력하면,

printf("wrong number. please enter a number between 1 and 10 in integer type. \n");

문장이 계속 실행된다는 것입니다.

디버깅 모드로 변수 testcase 가 입력에 따라서 어떤 값을 갖는지 관찰을 해봐도 왜 무한루프가 발생하는지 모르겠습니다.

많은 의견 부탁드립니다! 감사합니다 ( _ _ )

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • scanf를 통해 잘못 입력받은 값들이 계속 입력 스트림에 남아서 깽판을 부리는 것 때문에 발생하는 문제네요! 문제를 해결하기 위해서는 입력 스트림을 적절하게 비워주면 된답니다.

    처음 접하게 되면 꽤나 골때리는 버그죠ㅎ...

    하여간에 아래 코드를 참고해보세요. 추가한 줄은, 입력 스트림을 비워주기 위한 while (getchar() != '\n') {} 한 줄이에요. 물론 이 코드는 어디까지나 예시로, 다른 좋은 방법도 많답니다 :3

     

    #include <stdio.h>
    
    int main(void) {
        int testcase;
    
        while (1) {
            testcase = 0;
            printf("enter the number of testcase : ");
            scanf_s("%d", &testcase);
    
            if (testcase > 10 || testcase < 1) {
                while (getchar() != '\n') {} //입력 스트림 비워주기
                printf("wrong number. please enter a number between 1 and 10 in integer type. \n");
            }
    
            else {
                break;
            }
        }
    }
    
    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)