fgets() 함수란?
fgets() 함수는 문자열을 개행 문자(newline)까지 읽어들이는 데 사용됩니다. 이 함수는 배열의 경계를 검사하기 때문에 안전하게 사용할 수 있습니다.
C 언어에서 fgets()의 기본 문법은 다음과 같습니다.
char *fgets(char *string, int value, FILE *stream)
각 매개변수의 의미는 다음과 같습니다.
string − char 배열을 가리키는 포인터입니다.
value − 읽어들일 최대 문자 수입니다.
stream − 파일 객체를 가리키는 포인터입니다.
다음은 C 언어에서 fgets()를 사용한 예제입니다.
예제
#include <stdio.h>
#define FUNC 8
int main() {
char b[FUNC];
fgets(b, FUNC, stdin);
printf("The string is: %s\n", b);
return 0;
}
출력 결과
stdin 스트림으로 입력 문자열 "Hello World!"가 들어온 경우의 결과입니다.
The string is: Hello W
위 프로그램에서는 char 타입의 배열이 선언되었습니다. fgets() 함수는 STDIN 스트림에서 지정된 개수만큼의 문자를 읽어옵니다.
char b[FUNC];
fgets(b, FUNC, stdin);
배열 크기가 8로 선언되었으므로, fgets()는 널 종료 문자(\0)를 위한 공간을 남겨두고 최대 7개의 문자만 읽어들입니다. 그 결과 "Hello W"까지만 출력된 것을 확인할 수 있습니다. 이처럼 fgets()는 버퍼 오버플로우를 방지하므로 안전한 입력 처리에 적합합니다.
gets() 함수란?
gets() 함수는 표준 입력 장치로부터 문자열을 읽어들이는 데 사용됩니다. 하지만 이 함수는 배열의 경계를 검사하지 않기 때문에 보안상 매우 위험합니다.
C 언어에서 gets()의 기본 문법은 다음과 같습니다.
char *gets(char *string);
매개변수의 의미는 다음과 같습니다.
string − char 배열을 가리키는 포인터입니다.
다음은 C 언어에서 gets()를 사용한 예제입니다.
예제
#include <stdio.h>
#include <string.h>
int main() {
char s[100];
int i;
printf("\nEnter a string : ");
gets(s);
for (i = 0; s[i]!='\0'; i++) {
if(s[i] >= 'a' && s[i] <= 'z') {
s[i] = s[i] - 32;
}
}
printf("\nString in Upper Case = %s", s);
return 0;
}
출력 결과
Enter a string : hello world!
String in Upper Case = HELLO WORLD!
위 프로그램에서는 char 배열인 문자열 s를 대문자 문자열로 변환합니다. gets() 함수는 stdin 스트림에서 문자열을 읽어오는 데 사용되었습니다.
char s[100];
int i;
printf("\nEnter a string : ");
gets(s);
fgets()와 gets()의 차이점 및 주의사항
두 함수의 핵심적인 차이는 안전성에 있습니다. gets()는 입력 길이를 제한하지 않으므로, 배열 크기를 초과하는 입력이 들어오면 버퍼 오버플로우(buffer overflow)가 발생할 수 있습니다. 이는 프로그램 충돌이나 보안 취약점으로 이어질 수 있습니다.
실제로 gets() 함수는 이러한 위험성 때문에 C11 표준에서 공식적으로 제거되었습니다. 따라서 현대적인 C 프로그래밍에서는 반드시 fgets()를 사용하는 것이 권장됩니다. fgets()는 읽을 최대 문자 수를 지정할 수 있어 버퍼 크기를 초과하는 입력을 자동으로 잘라내므로 훨씬 안전합니다.