2016-09-16 1 views
1

나는()`루프 while scanf() returns when it gets what is expects or when it doesn't. What happens is it gets stuck in the을 사용하고 있습니다.왜 루프 내부에서 % d가있는 scanf()가 이전에 유효하지 않은 입력을받은 경우 사용자 입력을 기다리지 않습니까?

내 지식 test = scanf("%d", &testNum);은 숫자를 받으면 1을, 그렇지 않은 경우 0을 반환합니다.

내 코드 : 을 소비 여기

#include<stdio.h> 

int main(void) { 
    while (1) { 
     int testNum = 0; 
     int test; 
     printf("enter input"); 
     test = scanf("%d", &testNum); 
     printf("%d", test); 
     if (test == 0) { 
      printf("please enter a number"); 
      testNum = 0; 
     } 
     else { 
      printf("%d", testNum); 
     } 
    } 
    return(0); 
} 

답변

1

문제는, (예를 들어, 문자)를 무효 입력을 encountring에 잘못된 입력이되지 않습니다, 그것은 입력 버퍼에 남아 .

따라서 다음 루프에서 동일한 잘못된 입력이 scanf()으로 다시 읽혀집니다.

잘못된 입력을 식별 한 후 버퍼를 정리해야합니다. 매우 간단한 접근법

if (test == 0) { 
     printf("please enter a number"); 
     while (getchar() != '\n'); // clear the input buffer off invalid input 
     testNum = 0; 
    } 

말한 될 어느 test 초기화, 또는 자동 가변되는 test 같이 printf("%d", test); 삭제되며 초기화 명시하지 않으면 부정 값을 포함한다. undefined behavior을 호출 할 수있는 사용을 시도합니다.

즉, 단지 니키 피키, return은 기능이 아닙니다. 보이지 않게하십시오. 그것은 스테이임이므로, return 0;은 눈을 훨씬 더 부드럽게하고 혼란을 줄입니다.

+1

이렇게했습니다. 고맙습니다! – bubba

+1

'while (getchar()! = '\ n');'은 파일 끝 (end-of-file) 조건에서 무한 루프라는 것에주의하십시오. – chux

관련 문제