본문으로 이동

미디어위키 1.45 안정화가 거의 끝났습니다. 다만 Flow 확장 기능 관련 이슈가 있어서 대체하는 작업을 수행할 계획입니다.

  1. 큰숲백과:청사진에서 위키 발전의 대략적인 방향성을 제시했습니다. 의견이 있으신 분은 큰숲백과토론:청사진에서 의견을 남겨주시면 좋겠습니다.
  2. 기능상의 오류로 지원하지 않고 있는 기능에 대해서는 큰숲백과토론:이슈 트래커에 요약했습니다. 참고하시기 바랍니다.
  3. 데이터베이스 덤프 받고싶으신 분은 큰숲백과 가입 후에 사용자토론:Bigforest에 의견 남겨주시면 ftp 주소, 계정, 비밀번호를 특수:EmailUser를 통해서 공개할 예정입니다.

작은숲:위키노트/초보자를 위한 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() 함수의 경우는 그렇지 않다. 따라서 프로그래머가 마지막에 널문자를 추가해야 한다.

이 작은숲 문서의 출처는 위키노트의 위키노트: 문서입니다.