ungetc() 함수는 스트림에서 이미 읽은 문자를 다시 입력 스트림에 되돌려(push back) 넣어, 해당 문자를 한 번 더 읽을 수 있도록 해주는 C 표준 라이브러리 함수입니다.
C 언어에서 ungetc() 함수의 기본 구문은 다음과 같습니다.
int ungetc(int character, FILE *stream)
매개변수
- character − 입력 스트림에 되돌릴 문자입니다.
- stream − 파일 객체(FILE)를 가리키는 포인터입니다.
반환값
성공하면 되돌린 문자를 반환하고, 실패하면 EOF를 반환합니다.
예제
#include <stdio.h>
int main() {
int c;
while ((c = getchar()) != '0')
putchar(c);
ungetc(c, stdin);
c = getchar();
putchar(c);
puts("");
printf("The End!");
return 0;
}
실행 결과
s a b c t h 0 The End!
코드 설명
위 프로그램에서는 int형 변수 c를 선언한 뒤, getchar()로 문자를 하나씩 읽으며 '0'을 만날 때까지 반복합니다. 반복문이 진행되는 동안 읽은 모든 문자는 putchar()를 통해 화면에 출력됩니다.
int c;
while ((c = getchar()) != '0')
putchar(c);
ungetc(c, stdin)
c = getchar();
putchar(c);
puts("");
printf("The End!");
'0'을 만나 반복문이 종료되면, ungetc()가 마지막으로 읽은 문자 '0'을 표준 입력 스트림(stdin)에 되돌립니다. 이후 다시 getchar()를 호출하면 되돌려진 '0'을 한 번 더 읽어 출력할 수 있습니다. 마지막으로 줄바꿈 후 "The End!"를 출력하고 프로그램이 종료됩니다.
ungetc()의 대표적인 활용 사례
- 토큰 분석(파싱) − 숫자나 단어를 읽다가 구분자를 한 문자 미리 읽어버린 경우, 해당 문자를 되돌려 다음 처리 단계에서 활용할 수 있습니다.
- 입력 미리 보기(lookahead) − 다음 문자를 먼저 확인한 후 조건에 맞지 않으면 원래대로 되돌리는 방식으로 입력을 유연하게 처리할 수 있습니다.
주의 사항
표준 C 규격은 최소 1개의 문자 되돌리기를 보장하지만, 여러 문자를 연속해서 되돌리는 것은 컴파일러나 환경에 따라 지원되지 않을 수 있습니다. 또한 ungetc()는 파일 위치 표시자(file position indicator)를 한 칸 뒤로 이동시키므로, 되돌린 문자를 다시 읽으면 동일한 문자를 얻게 됩니다.