c언어 scanf()함수의 입력오류 ( 입력 버퍼 비우기)

 

지금까지 선택문 if문, if ~ else문, if ~ else if ~ else문 과  switch ~ csae문을 공부했고 반복문 for문, while문, do ~ while문 그리고 함수의 선언과 형태에 대해서 공부했습니다. 이제 여기까지 이해가 되셨다면 이제 이러한 문법들을 활용해서 간단한 프로그램을 만들어볼텐데 그전에 scanf()를 사용하게 될때 입력 버퍼를 비우지 않아서 생기는 오류가 발생할 수 있으니 먼저 한번 살펴보고 가겠습니다. 

 

scanf()함수의 입력버퍼 오류  

변수 int a와 char b를 선언하고 각각 scanf 함수로 데이터를 입력받는 소스입니다. 위에 소스 그대로 프로그램을 실행해 정수값을 입력하고 개행(enter)를 입력하면 입력과 동시에 프로그램은 끝나게 됩니다. 입력받은 b값은 입력도 안했는데.. scanf함수가 그냥 끝나버렸다. 

 

왜 그냥 끝났을까?? 그 이유는 바로 b값을 입력받는 scanf 함수가 입력을 받았다고 생각해 b값을 저장하고 종료한 것입니다. b값은 어떤 값이 들어있을까 출력을 해보면 b값에는 정수 10이 들어있는 것을 확인할 수 있습니다. 

왜 정수 10이 들어있을까? 그것은 아스키코드(ascii code)값의 문자 LF(new line)이 정수 10이기 때문입니다. 

즉 정수 123을 입력하고 enter를 치고 123값을 입력하고 다시 새로운 scanf를 받을 준비를 해야하지만 enter가 사라지지 않고 남아있어 두번째 scanf 함수에 enter값이 저장되어 b값에는 공백이 생기게 되는 것입니다. 사실상 공백이 아닌 enter값이 저장되어있는 것입니다. 

 

문제해결 방법

enter값이 입력되어지는 문제의 해결방법은 아주 간단합니다. 바로 입력버퍼를 비워주는 방법입니다. 

 

1. 화이트 스페이스(white space) 사용 

'%c'와 ' %c'

화이트 스페이스(white space)란 scanf함수에서 데이터를 입력받을때 사용하는 데이터의 경계를 나누는 (space Bar, Tab, Enter)키를 화이트 스페이스(white space)라고 부릅니다. 정수와 실수 그리고 문자열같은 변환문자로 숫자, 문자열을 입력할때 데이터를 구분하는 용도로 사용됩니다. 

 

서식문자 %c를 사용할때에는 문자를 입력받기 때문에 화이트 스페이스(white space)또한 문자로 인식하여 받게 됩니다. 문자로 인식되어지는 것을 막기 위해서는 '%c'를 선언할때 앞에 화이트 스페이스(white space)를 넣어 ' %c'공백을 만들어 주면 문자 입력중에 화이트 스페이스는 무시하고 그 외의 문자를 입력받게 됩니다. 

 

일반적인 '%c'는 화이트 스페이스(white space)까지 모두 문자로 인식하지만 화이트 스페이스(white space)를 제외한 문자를 인식 받을때에는 '%c'앞에 화이트 스페이스(white space)를 입력한다 

입력의 예 ( ' %c' 또는 '\n%c' 또는 '\t%c' 로 사용가능) 보통은 \n(개행)과 \t(탭) 사용대신 공백(스페이스 바)을 사용합니다.  

2. %*c 사용 

두번째 방법으로는 %*c를 추가하여 해결하는 방법이 있습니다. "%*c"는 입력은 받지만 저장은 하지 않는 것으로 enter값을 입력받지만 저장하지 않게 되어 버퍼를 비워버리는 방식입니다. 

scanf("%*c"); 라인을 추가해서 사용할 수 있다.
scanf("%*c %c",&b); 하나의 scanf 함수에 앞에 선언하여 사용할 수 있다. 

 

 

3. getchar() 함수 사용

 

getchar() 함수는 문자 전용 입력함수로 위에서 말했던 버퍼에 남아있던 enter값 10을 getchar()함수가 사용하게 되고 버퍼가 비워져 정상적으로 다음 라인에 있는 scanf함수가 문자를 입력받기위해 대기할 수 있습니다. 어떤 원리 일까?

 

 

바로 버퍼에 있던 값을 getchar()함수가 끌어다 사용하기때문에 버퍼는 자료를 넘겨주고 자신의 내용을 비우게 되기 때문입니다. 

 

그외에도 시스템에 따라서 fflush()함수 같이 다양한 방법이 있지만 화이트 스페이스, "%*c", getchar()의 사용으로만 알아봤습니다. scanf()의 버퍼오류에 대해서 알아봤습니다. 다음에는 지금까지 배운 내용을 가지고 간단한 프로그램을 한번 만들어 보는 시간을 가져보겠습니다. 

댓글

Designed by JB FACTORY