프로그래밍 초보 질문있습니다. 무한 루프 상황

totcryx의 이미지

#include <stdio.h>
 
int main()
{
	int c; // 배낭 용량
 
	do{
		printf("배낭의 용량은 얼마 입니까? : ");
		scanf_s("%d", &c);
 
		if (c <= 0)
			printf("잘못된 용량입니다.\n");
 
	}while (c<=0);
}

c값의 범위는 정해져있지 않습니다.

이런경우에 c값으로 숫자가 아닌 경우가 들어오면(예로 문자 r을 입력해봤습니다.)무한루프에 빠지게 되던데

숫자가 아닌 경우를 예외처리 하려면 어떻게 해야할까요..

totcryx의 이미지

아.. 버퍼를 비워줘야 하는군요..
왜그런지는 또 알아봐야겠습니다.

raymundo의 이미지

scanf는 자신이 지시받은 포맷으로 변환할 수 없는 입력을 만나면 그 시점에서 처리를 끝내고 리턴합니다.

%d 포맷을 처리하라고 했는데 문자 'r'을 입력 버퍼에서 읽게 되면, 이게 정수로 변환할 수 없는 문자니까 입력 버퍼에 그걸 놔둔 채로 빠져나가고, c의 값은 변하지 않은 상태로 있게 됩니다. 본문 코드의 경우 c는 초기화가 되지 않았으니 쓰레기값이 들어있을 텐데 그게 음수였나보죠.

그럼 while 에 걸려서 다시 루프를 돌고, scanf가 실행되고, 그런데 입력 버퍼에 여전히 'r'이 있으니 그냥 빠져나가고...의 반복입니다.

해결하는 방법은 여러 개가 있겠지만, fgets 같은 걸로 한 라인을 통채로 읽은 다음에 꼼꼼하게 라인의 각 문자를 검사해서 숫자만 남아 있는지를 확인한 후 처리하거나...

그게 귀찮고 간단한 프로그램이라면 그냥 저 상태에서 scanf 의 리턴값을 검사해서 제대로 입력을 받았는지 아닌지를 체크한 다음 입력을 못 받았다면 댓글에 쓰신 대로 버퍼를 비워버리고 재시도...하는 것도 방법이 될 것 같고요.

좋은 하루 되세요!

totcryx의 이미지

어떻게 해결하고보니 말씀하신 방법이랑 일치하네요