본문 바로가기
개발을하자/C

#Scanf&Buffer# 그리고 문자 입력에 대한 문제점!

by _ssu 2015. 6. 2.

문자를 입력안받고 넘어간다?


※ 예제코드

#include <stdio.h>

int main(void)
{
   int code_len;
   char ch;
   printf("숫자를 입력하세요 ");
   scanf("%d", &code_len);
   printf("문자를입력하세요 ");
   scanf("%c", &ch);
   return 0;
}

위 소스에서 보면 소스상 문제점이라곤 눈꼽 만큼도 없습니다.
하지만 프로그램을 돌려 보게 되면 7번째라인 정수형 값을 입력 받는 부분까진 문제없이 실행이 되지만
정수형값 입력종료와 동시에 두번째 scanf문은 점프되어 넘어가 버리는 현상이 나타납니다.


※ 프로그램 실행결과

이와 같은 현상이 나타나는 이유는 버퍼와 관계가 있습니다.
프로그램상 모든입력은 버퍼라는 임시 저장공간에 저장이 됩니다.
첫번째 scanf에서 1을 입력후 엔터를 치게되면 버퍼상에 아래와같이 임시 저장이 됩니다.

 1\n


버퍼에 저장된 1\n 에서 1은 변수 code_len에 저장이되고 버퍼에서 삭제됩니다.
이제 두번째 scanf를 실행 하게되고, %c(문자)를 입력 받으려 합니다.
여기서 %c는 버퍼에서 하나의 값만 읽어 들이게 되는데 현재 버퍼에는 \n이 남아 있는 상태이고
%c는 버퍼에서 \n를 받고 scanf 명령이 종료 됩니다.
프로그램상에선 정상적 처리가 되었다 봐야하지만 사실 정상적인 처리는 아니죠 
우리 프로그래머가 보기엔 두번째 scanf문이 뛰어 넘어간걸로 보이게 되는겁니다.

다른 입력 자료형 (%d나 %s등)들은 현재 버퍼에 무엇이 남아있는지와는 상관없이 원하는 자료형값 (%d라면 숫자, %s라면 문자)이 나오게 되면 그 후 나타나는 공백문자(\n, \t등)가 입력되면 종료하게 됩니다.

http://itguru.tistory.com/의 내용을 참고하여 작성 하였습니다.



댓글