프로그래밍 초보 질문있습니다. 무한 루프 상황
글쓴이: totcryx / 작성시간: 토, 2016/04/09 - 8:08오후
#include <stdio.h> int main() { int c; // 배낭 용량 do{ printf("배낭의 용량은 얼마 입니까? : "); scanf_s("%d", &c); if (c <= 0) printf("잘못된 용량입니다.\n"); }while (c<=0); }
c값의 범위는 정해져있지 않습니다.
이런경우에 c값으로 숫자가 아닌 경우가 들어오면(예로 문자 r을 입력해봤습니다.)무한루프에 빠지게 되던데
숫자가 아닌 경우를 예외처리 하려면 어떻게 해야할까요..
Forums:
해결했습니다
아.. 버퍼를 비워줘야 하는군요..
왜그런지는 또 알아봐야겠습니다.
scanf는 자신이 지시받은 포맷으로 변환할 수 없는
scanf는 자신이 지시받은 포맷으로 변환할 수 없는 입력을 만나면 그 시점에서 처리를 끝내고 리턴합니다.
%d 포맷을 처리하라고 했는데 문자 'r'을 입력 버퍼에서 읽게 되면, 이게 정수로 변환할 수 없는 문자니까 입력 버퍼에 그걸 놔둔 채로 빠져나가고, c의 값은 변하지 않은 상태로 있게 됩니다. 본문 코드의 경우 c는 초기화가 되지 않았으니 쓰레기값이 들어있을 텐데 그게 음수였나보죠.
그럼 while 에 걸려서 다시 루프를 돌고, scanf가 실행되고, 그런데 입력 버퍼에 여전히 'r'이 있으니 그냥 빠져나가고...의 반복입니다.
해결하는 방법은 여러 개가 있겠지만, fgets 같은 걸로 한 라인을 통채로 읽은 다음에 꼼꼼하게 라인의 각 문자를 검사해서 숫자만 남아 있는지를 확인한 후 처리하거나...
그게 귀찮고 간단한 프로그램이라면 그냥 저 상태에서 scanf 의 리턴값을 검사해서 제대로 입력을 받았는지 아닌지를 체크한 다음 입력을 못 받았다면 댓글에 쓰신 대로 버퍼를 비워버리고 재시도...하는 것도 방법이 될 것 같고요.
좋은 하루 되세요!
감사합니다
어떻게 해결하고보니 말씀하신 방법이랑 일치하네요
댓글 달기