GETS(3)

이름
fgetc, fgets, getc, getchar, gets, ungetc - 문자와 문자열을 입력 받는 함수

사용법
#include <stdio.h>

int fgetc(FILE *stream);
char *fgets(char *s, int size, FILE *stream);
int getc(FILE *stream);
int getchar(void);
char *gets(char *s);
int ungetc(int c, FILE *stream);

설명
fgetc()는 stream이 가리키는 바로 다음 문자를 읽어서 원래 데이터형인 unsigned char를 int로 변환한 다음 반환값으로 돌려준다. 만약 파일의 끝에 도달했을 경우에는 EOF를 반환하고 문제가 발생하면 에러를 반환한다.

getc()는 stream을 여러 번 검사하는 매크로 함수로 구현되어 있다는 점을 제외하고는 fgetc()와 동일하다.

getchar()는 getc(stdin)와 동일하다. 즉 표준 입력을 통해서 문자를 입력 받는다.

gets()는 표준 입력(stdin)으로부터 개행 문자나 EOF로 끝나는 한 줄을 입력 받아서 s가 가리키는 버퍼에 저장하고 마지막을 '\0'로 변경한다. 그러나 버퍼 오버플로우에 대한 검사를 하지 않는다. (이 점에 대해서는 아래의 버그를 보기 바란다.)

fgets()는 최대 size - 1 개 이하의 문자를 stream으로부터 읽어서 s가 가리키는 버퍼에 저장한다. 그러나 EOF나 개행 문자를 입력 받았을 경우에는 읽기를 멈춘다. 입력 받은 개행 문자는 그대로 버퍼에 저장하고 '\0'을 버퍼의 마지막 문자 다음에 추가한다.

ungetc()는 c를 unsigned char로 변환한 다음, 읽기 명령에 의해 다시 읽어들일 수 있도록 stream에 푸쉬한다. 푸쉬한다 - 라는 말은 문자가 지정한 위치에 명령의 역순으로 저장된다는 말이다; 즉 단 한 문자의 푸쉬만을 보장할 수 있다.

여기에서 설명한 함수는 서로 섞어서 호출할 수도 있고, 같은 종류의 입력 스트림에 대한 stdio 라이브러리의 함수와 섞어서 호출할 수도 있다.

반환값
fgetc(), getc()와 getchar()는 unsigned char로 읽어들인 문자를 int로 형 변환하여 반환한다. 그러나 파일의 마지막일 경우에는 EOF를, 에러가 발생했을 경우에는 에러값을 반환한다.

gets()와 fgets()는 성공했을 경우 문자열의 포인터 s를 반환한다. 그리고 에러가 발생하거나 파일의 마지막에 도달한 경우, 또한 아무런 문자도 입력 받지 못한 경우에는 NULL을 반환한다.

ungetc()는 성공했을 때는 c를 반환하고 에러가 발생했을 경우에는 EOF를 반환한다.

호환
ANSI - C, POSIX.1

버그
가급적 gets()를 사용하지 마라. gets()가 얼마나 많은 문자를 읽어들일 지 사전에 알 수 없고, 그로 인해 gets()가 버퍼의 용량을 넘어서는 범위에 문자를 저장할 위험이 있다. 그러므로 gets()를 사용하는 것은 컴퓨터 보안에 치명적인 타격을 줄 수 있다. (버퍼 오버플로우를 이용한 해킹이 가능하다. - 역주) 대신 fgets()을 사용하는 것이 좋다.

여기에서 설명한 함수의 입력 스트림을 stdio 라이브러리의 로우-레벨 시스템 콜인 read()의 파일 디스크립터와 공유해서 사용하는 것은 결코 좋은 방법이 아니다. 그 결과가 정의되어 있지 않아서 의도하지 않은 방향으로 동작할 가능성이 크기 때문이다.

관련 항목
read(2), write(2), fopen(3), fread(3), scanf(3), puts(3), fseek(3), ferror(3)

번역
류정욱 <compiler@kldp.org>, 2000년 4월 21일