C && C++

[C] 입력 버퍼 비우기

힘법사 2022. 1. 18. 23:52
728x90

C 언어로 프로그램을 짜다 보면

int main(void){
	char buf[10];
	scanf("%s", &buf);
    return 0;
}

해당 경우와 같이 입력을 사용자로부터 받아와야 하는 경우를 만나보셨을 겁니다.

 

저도 최근에 제 친구가 C언어로 다이아몬드 출력하는 부분을 연습 코드로 만들고 있는 것을 보고 저도 재밌을 것 같아서 같이 만들었는데요, 그때 사용자로부터 입력을 받으면서 문제를 하나 만났습니다.

 

int main(void) {
	
	int size;
	char blank_sym;
	char sym;
	printf("Please enter the size of diamond shape : ");
	scanf("%d", &size);

	printf("Please enter blank symbol which you want to use : ");
	scanf("%c", &blank_sym);

	printf("Please enter symbol which you want to use : ");
	scanf("%c", &sym);
	print_dia(sym,blank_sym, size);
	return 0;
}

 

이게 문제의 코드입니다. main 함수를 확인하면, 사용자로 부터 입력을 총 3라인에서 받는 것을 확인할 수 있습니다. 자 그러면 원하는 동작 순서는 다음과 같습니다.

 

1. 사용자로 부터 다이몬드의 크기를 입력 받는다.

2. 사용자로부터 다이아몬드의 배경으로 사용할 char를 입력받는다.

3. 사용자로부터 다이아몬드를 표현할 char를 입력받는다.

 

자 어떻게 될까요?

728x90

그림1. 문제 상황

보시면 제가 5를 입력을 해준 후에 2 과정을 생략하고 바로 3번째 입력을 받아버립니다.

 

이러면 프로그램이 원하는 의도로 동작하지 못하겠죠?

 

이런 일이 발생하는 이유는 엔터 입력(\n)이 입력 버퍼에 남아 사용하자가 입력하지 않았지만 프로그램이 입력으로 받아 동작했기 때문입니다.

 

이를 해결해주는 방법으로 저는 과거에는 해당 일이 발생하는 부분에 모두 getchar();를 삽입 주었습니다.

int main(void) {
	
	int size;
	char blank_sym;
	char sym;
	printf("Please enter the size of diamond shape : ");
	scanf("%d", &size);
	getchar();
	printf("Please enter blank symbol which you want to use : ");
	scanf("%c", &blank_sym);
	getchar();
	printf("Please enter symbol which you want to use : ");
	scanf("%c", &sym);
	print_dia(sym,blank_sym, size);
	return 0;
}

이렇게 써주게 되면 입력 버퍼에 남아있는 \n가 getchar(); 에 의해서 제거되게 됩니다.

프로그램이 아주 잘 동작하죠?

 

또 다른 방법은 무엇이 있을까요?

 

저는 최근에는 while(getchar() != '\n')를 사용해주고 있습니다.

즉 해석을 해보면, '\n'가 사라질 때까지 getchar()를 호출해주겠다는 의미가 됩니다.

 

이를 적용해 코드를 만들어 보면 아래처럼 쓸 수 있겠죠

int main(void) {
	
	int size;
	char blank_sym;
	char sym;
	printf("Please enter the size of diamond shape : ");
	scanf("%d", &size);

	printf("Please enter blank symbol which you want to use : ");
	while (getchar() != '\n');
	scanf("%c", &blank_sym);

	printf("Please enter symbol which you want to use : ");
	while (getchar() != '\n');
	scanf("%c", &sym);
	print_dia(sym,blank_sym, size);
	return 0;
}

마찬가지로 실행결과 또한 훌륭합니다.

 

다음에도 좋은 포스팅으로 돌아오겠습니다 감사합니다!

728x90