201303/ getchar()와 getch()

2013. 4. 3. 16:55프로그래밍/C언어 TIP

◈ getchar()와 getch()

getchar()는 버퍼를 사용하고 있기 때문에 엔터를 치기 전까지 계속 입력을 받을 수 있다. 겉으로 보면 한글자 한글자를 처리하는 듯 보여지만 실제로는 버퍼를 사용해서 엔터키 이전의 문자를 한번에 처리해주는 함수이다. 문자열의 출력이 가능하지만 %c로 출력 할 경우 엔터를 치면 맨 첫번째 문자만 출력된다.

그에 반해 getch()는 버퍼를 사용하지 않기 때문에 키보드로부터 문자 하나를 읽어들일 때까지 block상태를 유지한다. 키가 입력되면 곧바로 각 문자를 반환한다. 엔터키도 하나의 문자로 간주하여 엔터키만 쳐도 입력이 된다. getch()는 윈도우만에서 사용되는 함수라 리눅스로 프로그램을 짤 때는 적용되지 않는다.


위 화면은 예제 p3-23을 리눅스 vi편집기를 통해 작업한 내용이다. 다음 소스를 분석해 보면 for문의 조건식에 ch가 getchar()함수로부터 키보드입력을 받는다. 원래 예제에는 getchar()가 아닌 getch()가 있었지만 리눅스에서는 getch()가 적용되지 않지 때문에 getchar()로 대체하여 사용한 것을 볼 수 있다. printf()문에 %c로 되어 있어 문자 하나를 출력한다. printf()문 사이에 getchar()를 한번 더 적어준 이유는 getchar()함수를 사용하면서 생긴 버퍼에 엔터값 때문이다. getchar()가 없으면 엔터도 하나의 입력으로 받아 들여 for문이 한번 더 수행되게 된다. 

getchar()를 쓰지 않았을 때는 위와 같이 빈 공간이라 생각되는 엔터값이 입력되게 되는 것이다. 실제로는 빈공간이 아니라 엔터의 아스키코드 값이 들어 가게 되는 것이다. 위와 같은 결과를 방지 하기 위해 getchar()를 적어 엔터의 입력으로 받게 되는 것이다. 나중에 입력된 엔터의 값을 수행중에 사라져 버리기 때문에 출력 되지 않는다.

◈ 명령문에 의한 제어변수의 변경 

위의 소스에서 알 수 있는 점은 증감식이 for문안에 들어 있지 않아도 명령문으로 써줘도 실행되는 데는 아무런 문제가 없음을 보여주는 화면이다. 하나의 구문형태를 보여주고 있는 소스라고 할 수 있다. for문안에 초기식, 조건식, 증감식이 모두 들어 있어야 한다는 생각에 대한 고정된 생각을 바꿔주는 것이다. 초기식을 밖으로 빼면 while문과 같은 형식의 구문이 되는 것이다. 위의for문 소스를 while문으로 바꾸게 되면 아래와 같이 된다.


속 머리로 익혀 for문과 while문을 이해해보자.

'프로그래밍 > C언어 TIP' 카테고리의 다른 글

201303/포인터의 이해  (0) 2013.04.03
201303/변수의 값과 주소. 포인터의 개념. littleendian  (0) 2013.04.03
201303/for문  (0) 2013.04.03
201303/while문. 심볼테이블. gerch()  (0) 2013.04.03
201303/반복문  (0) 2013.04.03