본문 바로가기
프로그래밍/C·C++

getc(), getch(), getchar()

by ITPro 2010. 8. 11.
출처 카페 > 임베디드 시스템(Device.. | 별빛
원문 http://cafe.naver.com/devctrl/1762

getchar()는 조금 조심스럽게 사용해야 한다. 실제적으로 반환하는 적당한 데이타는 8비트 char 타입이지만, 데이타를 받을 타입은 int 타입이어야 한다. 왜냐하면 8비트 데이타를 반환받고 나면 에러를 검출할 방법이 없기 때문이다.

 

int 타입이 16비트나 32비트이기 때문에 EOF = (-1)을 에러의 검출에 사용할 수 있다. 그러므로 putchar()를 호출하기 전에 EOF를 먼저 테스트해야 한다.

 

(-1)을 putchar()에 넘기면 문제는 일어나지 않는다. 이유는 (-1) = 255이고 255번 문자는 phantom space로 불리는 문자가 화면에 찍히고 이것은 정확히 "공백 = 32"과 같은 모양의 폰트가 화면에 찍힌다. 

 

getch()는 표준입력으로부터 문자 한개를 받아들인다는 면에서는 getchar() 또는 getc()와 비슷한 일을 한다. 그러나 중요한 차이점이 있는데, 그것은 getch()는 스트림 버퍼가 아닌, 입력장치의 하드웨어 버퍼에 의존적이라는 특성을 가진다. 무슨 말이냐면, getch()는 대충 다음과 같이 동작을 한다.

 

1) 입력스트림에 문자가 남아 있다면 문자를 한개 가져온다.
2) 1)에서 입력스트림이 비어 있다면 입력장치로부터 문자가 한개 들어올때까지 기다렸다가 입력받는다.

 

getchar() 또는 getc()와의 차이를 모르겠다면, getc()의 동작은 다음과 같습니다.

 

1) 입력스트림에 문자가 남아있다면 문자를 한개 가져온다.
2) 1)에서 입력스트림이 비어 있다면 입력 스트림이 유효해질때까지 기다렸다가 입력받는다.

 

무슨 말인고 하니, getc()는 문자 한개를 입력받더라도 입력하고자 하는 문자를 치고 [엔터]키를 눌러야 비로소 입력스트림에 들어가서 함수가 리턴된다. 그러나 getch()는 입력스트림이 비어있다면 직접 하드웨어 버퍼에서 문자를 입력받으므로 [엔터]를 치지 않아도 문자가 한개라도 들어온다면 리턴된다는 점이 다르다. getch()는 문제가 좀 있는 방법이다.

 

우선, getch()는 표준함수가 아니다. 즉, DOS기반 컴파일러에는 포함이 되어 있지만, 다른 ANSI 표준 컴파일러에는 없을수도 있으며, 실제로 getch()가 포함되어 있지 않은 컴파일러가 더 많다. 그리고 getch()를 다른 표준 입력 함수와 혼용했을 경우, 스트림 버퍼 관리의 불일치로 인해 알수 없는 동작을 할 우려가 있다.

 

DOS에서 프로그래밍 할 때에는 흔히 사용자가 누르는 임의의 키를 받아들이는 방법으로 쓰곤 했던 함수이다.

 

getc는 ANSI와 호환이 되고 getchar는 ANSI와는 호환이 되지 않는다.

반응형

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

리눅스 로케일 세팅  (0) 2010.08.11
리눅스 curses.h 설명  (0) 2010.08.11
리눅스 curses.h 사용 예  (0) 2010.08.11
전역변수&extern  (0) 2010.08.11
char ch = getchar();의 문제의 원인  (0) 2010.08.11

바로가기