Manpages

이 름

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 charint로 변 환 한 다 음 반 환 값 으 로 돌 려 준 다 . 만 약 파 일 의 끝 에 도 달 했 을 경 우 에 는 EOF를 반 환 하 고 문 제 가 발 생 하 면 에 러 를 반 환 한 다 .

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

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

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

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

ungetc()cunsigned 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 [AT] kldp.org>, 2000년 4월 21일