[C] scanf 함수 2

2021. 1. 7. 22:38프로그래밍 공부/C 공부

scanf 함수의 입력형식 키워드에 어긋나는 자료형을 입력하면 컴파일중에는 문제가 없지만 출력과정에서 문제가 발생한다고 했었다. 다음의 코드가 좋은 예시가 된다.

#include <stdio.h>

void main()
{
	int num = 0;
	while (1) {
		printf("input age : ");
		scanf_s("%d", &num); //만약 %d형 자료에 정수가 아니라 문자를 입력했다면?

		if (num > 0 && num < 130) break;
		else printf("incorrect age!\n");
	}
	printf("your age is %d", num);
}

만약 사용자가 num에 정수형 데이터를 입력한다면 오류가 없지만, 만약 문자나 문자열을 입력한다면 어떻게 될까?

 

(1) 예를 들어 abc를 입력했다고 하면 오류이기 때문에 입력버퍼에는 abc[Enter]를 그대로 두고 오류 값 0 을 반환한다.

(2) num값이 0이 되는것이고 if조건에 의해  incorrect age를 출력하게된다.

(3) 무한 loop에 걸려있는 while문이 종료되지 않았기 때문에 scanf_s가 다시 실행된다.

(4) 입력버퍼에 있는 값이 abc[Enter] 이기 때문에 같은 같은 오류가 또 발생하여 num 은 0이 된다.

(5) 같은 과정이 무한히 반복되어 incorrect age가 무한히 출력된다.

 

이러한 문제를 해결하기 위해서는 rewind로 버퍼를 초기화 시켜주면 된다. 

아래 코드는 if문이 많아져서 보기가 좀 별로일지라도 위와 같은 오류가 발생하지는 않는다.

#include <stdio.h>

void main()
{
	int num = 0;
	while (1) {
		printf("input age : ");
        
		if (scanf_s("%d", &num) == 0) 
		{
			rewind(stdin);
			printf("Enter digit number! \n");
		}
		else 
		{
			if (num > 0 && num < 130) 
			{ break;} 
			else 
			{printf("incorrect age!\n"); }
		}
		
	}
	printf("your age is %d", num);
}

 

'프로그래밍 공부 > C 공부' 카테고리의 다른 글

[C] 배열과 포인터 2  (0) 2021.01.08
[C] 배열과 포인터  (0) 2021.01.07
[C] scanf 함수 1  (0) 2021.01.07
[C] 문자, 문자열  (0) 2021.01.06
[C] void 포인터  (0) 2021.01.06