카테고리 없음

[c언어] scanf 다시 사용할 때 공백 넣어야 하는 이유

hatch 2023. 9. 11. 16:26
728x90
반응형
문제

오랜만에 c언어 복습하다 문제상황에 부딪혔다.

scanf를 다시 쓰려고 하니 입력을 안 받고 그냥 넘어가는 것이다.

 

여기 간단한 사칙연산 예제를 보자

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void main() {
	int a, c;
	char b;
	printf("첫째 계산 값: ");
	scanf("%d", &a);
	printf("연산자 입력(+, -, *, /): ");
	scanf("%c", &b);
	printf("둘째 계산 값: ");
	scanf("%d", &c);

	int result;

	if (c > 0) {
		switch (b) {
		case '+':
			result = a + c;
			printf("%d", result); break;
		case '-':
			result = a - c;
			printf("%d", result); break;
		case '*':
			result = a * c;
			printf("%d", result); break;
		case '/':
			result = a / c;
			printf("%d", result); break;
		}
	}
	else printf("0으로 나눌 수 없습니다. 자연수를 입력하세요.");
}

이렇게 하면 정상적으로 돌아갈까?

 

아니다. 연산자 입력값을 skip 하게 된다.

당연히 이후 과정을 진행해도 결과가 정상적으로 출력되지는 않는다.

 

 

그럼 어떻게 해야 할까?

 

해결

scanf를 다시 사용하는 입력문에 공백을 넣어줘야 한다.

 

이 예제에서는 %c 앞에 공백을 넣어주면 된다.

printf("연산자 입력(+, -, *, /): ");
scanf(" %c", &b);

 

정상적으로 출력된 결과값

그럼 그 이유는 무엇일까??

Scanf() 함수의 버퍼 데이터를 비워야 하기 때문이다.

키보드를 통해 화면에 보여지기까지의 과정에서 <입력 버퍼>를 거치게 된다.

따라서 앞에서 scanf를 사용했다면, 다시 사용할 때 이미 scanf 버퍼가 차있는 것이다.

 

버퍼 비우는 법은 다음과 같다.

1. " %c" 와 같이 공백을 앞에 두면 white space로 인식해 버퍼가 비워지게 된다.

  • scanf는 공백을 기준으로 입력받는다.
  • 버퍼를 비우려면 → 공백을 넣어주면 된다!

2. getchar()를 이용해 개행문자를 제거한다.