작은숲:위키노트/초보자를 위한 C 언어 강의/gets() 함수와 fgets() 함수
gets() 함수와 fgets() 함수의 가장 큰 차이점은 gets() 함수의 경우는 표준 입력, stdin에서 입력을 받는다는 것이고, fgets() 함수는 입력받을 스트림을 지정해줄 수 있다는 것이다. 이것 말고도 다른 점이 있는데, 우선 함수 원형을 보도록 하자.
#include <stdio.h>
char *fgets(char *s, int size, FILE *stream);
char *gets(char *s);이 두 함수 모두 stdio.h에 선언되어 있다.
반환하는 값도 같다. 저장시킨 버퍼의 포인터이다. 다른 것이라면 fgets() 함수에서는 입력받을 문자열의 최대 길이를 지정해준다는 것이다. 위에서 size가 바로 그것이다. 이것은 gets() 함수에는 없는 것이다.
때때로 이것은 아주 중요한 문제이기도 하다. 다음 예를 보도록 하자.
char str[81];
gets(str);이렇게 배열을 선언한 후 문자열을 읽어들여 배열에 저장한다. 이럴 때 만약 사용자가 80자 이상의 글자를 입력하게 되면 어떻게 될까? 당연히 배열의 공간을 넘어선다. 즉, overflow가 나게 된다. 이 overflow는 상당히 큰 문제를 일으킬 수도 있다. 때에 따라서는 시스템을 먹통으로 만들어버리기도 한다. 이와 같은 문제 때문에 gets() 함수보다는 fgets() 함수를 사용하도록 권고하고 있다.
위와 같은 경우라면,
char str[81];
fgets(str, 80, stdin);위와 같이 해주면 된다.
그리고, 한가지 다른 점은 gets() 함수의 경우 개행문자를 포함해서 읽어들인 다음, 그 개행문자를 널문자로 변환시켜 준다. 그래서 gets() 함수로 사용자의 입력을 받는 경우에는 완전한 하나의 문자열이 완성되지만, fgets() 함수의 경우는 그렇지 않다. 따라서 프로그래머가 마지막에 널문자를 추가해야 한다.