gets()와 fgets() 함수는 말 그대로 문자열을 입력받는 함수이다.
"입력받을 땐 scanf 함수를 쓰면 되지, 왜 굳이 저 함수를 쓰는 것일까?"
scanf( ) 를 이용해 문장을 입력받으면, 첫 번째 단어까지만 저장되지만
gets( )와 fgets( ) 를 사용하면 공백문자가 포함되어있는 문장을 입력받아 저장할 수 있다.
무슨 뜻이나면, Hello World!를 scanf로 입력받으면 사실상 Hello 까지만 입력된다.
하지만 gets와 fgets는 Hello World! 문장이 전체 입력된다.
"위 두 함수의 차이는 무엇일까?"
gets()를 쓰면 확실히 문장 구성은 간단하지만, 마련해놓은 배열의 길이를 넘어서면 할당 받지 않은 메모리 공간을 침범할 수도 있다.
그래서 가급적이면 fgets() 함수를 사용하자.
아래 코드는 각각 gets와 fgets 함수를 사용한 예제이다.
int main(void)
{
char str[5];
gets(str);
return 0;
}
int main(void)
{
char str[5];
fgets(str, sizeof(str), stdin);
return 0;
}
위에서 fgets(str, sizeof(str), stdin); 이 문장은
stdin(표준입력)으로부터 문자열을 입력받아서 배열 str에 저장하되, sizeof(str)의 길이만큼만 저장해라! 라는 뜻이다.
여기서 우리가 잊지 말아야 할 것이 있다.
바로 문자열의 끝은 널 문자를 위한 공간이다.
문자열을 입력받으면 문자열의 끝엔 자동으로 널 문자가 추가된다.
그래서 위의 sizeof(str)의 반환값은 5보다 하나 작은 4이다.
int main(void)
{
char str[5];
fgets(str, sizeof(str), stdin);
printf("%s", str);
return 0;
}
위의 코드를 실행시켜, 12345를 입력한다면,
1234만 출력될 것이다.
문자열의 끝엔 널 문자가 저장될 공간이기 때문에, 네 개의 공간에만 문자를 저장할 수 있다.
마지막으로, fgets 함수는 \n도 문자열의 일부로 받아들인다. (gets 함수는 받아들이지 않는다.)
끝까지 봐주셔서 정말 감사합니다.
고칠 부분이나 충고해주실 부분이 있으면 댓글 부탁드립니다.
<윤성우의 열혈 C 프로그래밍>책을 참고하였습니다.