C 언어 - scan 무한 반복 에러

컴퓨터/C

728x90
반응형

잘못된 입력으로 무한히 반복되는 에러

scanf를 사용하여 프로그래밍을 하다 보면 입력 스트림 버퍼에 남아있는 녀석들 때문에 예상치 못한 예외가 발생하곤 합니다. 

특히 정수를 받기위해 scanf함수를 사용했는데 문자 등을 입력했을 때는 무한하게 소스코드가 반복되는 현상이 일어나곤 합니다. 

 

예제 코드

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
	int input;

	while (1) {
		printf("1에서 10사이의 숫자를 입력하세요 :");
		scanf("%d", &input);
		if (input < 11 && input > 0) {
			printf("%d를 입력했습니다.\n",input	);
			break;
		}
		else {
			printf("잘못된 값을 입력 했습니다\n");
		}
	}
	return 0;
}

만약 위와 같은 소스코드를 작성하여 프로그램을 실행하다 보면 특이한 상황을 마주하게 됩니다.

프로그래머는 위의 소스코드를 통해 다음과 같은 결과를 얻기를 원했습니다.

  • 1부터 10까지의 입력을 받으면 받은 값을 출력 후 프로그램 종료
  • 그 이외의 값을 받았을 경우 잘못된 값을 입력했습니다 출력 후 다시 반복

하지면 결과는 다음과 같습니다.

계속해서 잘못된 값을 입력받았다며 무한하게 반복되어 버립니다. 

본 포스트에서는 이 유과 극복 방법에 대해 알아보도록 하겠습니다.

 

무한 반복의 이유

위의 소스코드에서 scanf함수를 통해 정수를 추출하려고 했습니다. 하지만 입력된 값은 문자입니다. 

그때에 scanf함수는 'aa'라는 문자를 입력 버퍼에서 추출하지 못했고 따라서 입력버퍼에 'aa'라는 문자가 존재한 채로 다시 반복문에 진입하게 됩니다.  따라서 사용자가 다시 입력하지 않아도 입력버퍼에 있는 값 때문에 무한히 반복되는 에러가 발생하게 됩니다.

 

해결 방법

해결방법은 간단합니다. 

잘못된 입력이 발생했을 때 입력 버퍼를 비우면 되는 것 입니다. 

입력버퍼를 비우는 방법은 아래 포스터를 참조하시길 바라며 오늘은 gatchar()를 통해서 극복하는 케이스를 몇 가지 소개하고 마무리하도록 하겠습니다.

 

C 언어 - 버퍼와 scanf 함수 (다양한 에러의 원인과 해결법)

scanf의 맹점 - 입력 버퍼와의 관계 C언어를 이용하여 다양한 프로그래밍을 하다 보면 아래와 같은 경우를 자주 만나게 됩니다. #define _CRT_SECURE_NO_WARNINGS #include int main() { int numinput; char char..

blog-of-gon.tistory.com

 

해결 예제 소스코드

  • 예외가 발생했을 때 버퍼를 초기화 
    • getchar()를 이용하여 개행 문자를 만날 때까지 입력 버퍼를 소모하기
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
	int input;

	while (1) {
		printf("1에서 10사이의 숫자를 입력하세요 :");
		scanf("%d", &input);
		if (input < 11 && input > 0) {
			printf("%d를 입력했습니다.\n",input	);
			break;
		}
		else {
			//예외에 진입 했을 때 초기화
			while (getchar() != '\n');
			printf("잘못된 값을 입력 했습니다\n");
		}
	}
	return 0;
}

728x90
반응형

Commnet

G91개발일지

Gon91(지구일)

91년생 공학엔지니어의 개발일지

TODAY :

YESTER DAY :

TOTAL :