2025년, 코딩은 선택이 아닌 필수!

2025년 모든 학교에서 코딩이 시작 됩니다. 먼저 준비하는 사람만이 기술을 선도해 갑니다~

강의자료/정보영재

알고리즘 대회 문제 풀이 시 문자열 입력 할때 gets 보다 fgets를 권장합니다.

원당컴퓨터학원 2019. 4. 15. 08:34

C언어로 문자열 입력을 받을때 일반적으로 다음의 명령을 사용하게 됩니다.

char str[101];

scanf("%s",str);

이렇게 scanf 로 입력을 받게 되면 "Hello World" 와 같이 스페이스가 있는 문자열은 "Hello" 만을 입력 받게 됩니다.

따라서 scanf 입력시에는 문자열 중에서 단어별로 입력을 받을때 자주 사용하게 됩니다.

하지만 알고리즘상 스페이스를 같이 입력 받아야 할때가 있습니다. 위와 같이 "Hello World" 를 입력 받아서 2개의 단어로 처리 해야 하는지 또는 단어를 분리해야 하는 경우등이 있을수 있는데...

이때는 일반적으로 gets(str) 과 같이 gets 함수를 사용하게 됩니다.

그런데 이 gets() 함수가 치명적인 결함을 가지고 있는데 어떤 문제인가 하면

위와 같이 gets(str) 을 사용했는데 str이 101바이트만 메모리 할당이 되어 있는데 1000바이트의 데이터가 입력이 들어 오는 경우입니다.

일반적으로 char str[101]; 선언을 하면 OS 에서는 현재 사용하고 있지 않은 메모리 중에서 101 바이트를 할당하게 됩니다. 그리고 다른 int a; 와 같이 다른 변수를 선언 하게 되었을때 그 뒤의 메모리를 a 에 할당 할 수 있겠네요.

혹은 다른 프로그램에서 그 뒤의영역을 할당 받아 사용할 수도 있을것입니다.

이렇게 그 뒤의 메모리 영역을 할당받아 사용중에...

gets(str) 에 따라 그 뒤의 메모리 영역에 현재 값이 들어가면 치명적인 오류가 발생할 소지가 있습니다.

그래서 C++11 버젼 부터는 gets() 함수를 지원하지 않게 됩니다.

따라서 C++11 버젼 이후 부터를 떠나서 안전성을 위해서라도 fgets() 함수를 사용하시기를 권장합니다.

fgets() 함수의 사용법은 다음과 같습니다.

fgets(str,101,stdin); //str 은 char str[101], 101 은 최대 크기 101 바이트 이상은 안 읽겠다, stdin 표준입력 에서 읽겠다

fgets 함수는 파일을 버퍼에 읽을때 사용하는 함수인데 표준입력을 파일 형태로 받아 들이면 gets() 와 동일하게 사용할 수 있습니다.

이렇게 읽은 버퍼의 마지막에 '\n'(엔터값) 이 포함 되어 있을 수 있습니다.

이 엔터값을 없애 주기 위해서는 다음과 같은 작업을 수행해 주어야 합니다.

len = strlen(str);

if(str[len-1] == '\n') str[--len] = '\0'; //마지막 글자가 \n(엔터) 라면 \0(NULL) 값으로 바꾸어 준다.

이렇게 처리해서 사용해 주시면 안정성 면에서나 나중에 C++11 이후 버젼에서 갑자기 gets() 함수가 지원이 안될때라도 문제 없이 해결 할 수 있겠네요.

 

 

사업자 정보 표시
원당컴퓨터학원 | 기희경 | 인천 서구 당하동 1028-2 장원프라자 502호 | 사업자 등록번호 : 301-96-83080 | TEL : 032-565-5497 | Mail : icon001@naver.com | 통신판매신고번호 : 호 | 사이버몰의 이용약관 바로가기