본문으로 바로가기
homeimage
  1. Home
  2. 컴퓨터/프로그래밍
  3. C언어 gets 함수 표준 장치로부터 문자열 입력

C언어 gets 함수 표준 장치로부터 문자열 입력

· 댓글개 · 바다야크

C gets() 표준 장치로부터 문자열 입력 함수

표준 입력 장치로부터 문자열을 입력받습니다.

  • 헤더: stdio.h
  • 형태: char *gets(char *s)
  • 인수: char s 문자열을 입력받을 메모리 포인터
  • 반환: char *s 입력 받은 문자열 포인터, NULL이면 입력 오류

gets() 함수를 사용하고 컴파일하면 warning이 아래와 같이 출력됩니다. 잘못된 부분도 없는데 경고가 나오니 매우 찜찜합니다.

/test.c:8: warning: the `gets' function is dangerous and should not be used.

이것은 잘못 코딩한 것이 아니라 gets()가 overflow를 검사하지 못하기 때문에 위험하다는 메시지로 gets 보다는 fgets를 사용하라는 경고입니다.

gets()는 문자열을 입력받는 메모리의 포인터만 인수로 받고, 포인터의 크기를 알려 주는 인수가 없습니다. 그러므로 버퍼 크기 이상으로 문자열을 입력하면 단순 무식하게 그대로 포인터의 메모리에 넣어 버립니다. 이럴 경우 버퍼 오퍼플로우 에러가 발생하며, 이를 해킹에서 악용될 수 있습니다.

그러므로 버퍼의 크기를 인수로 넘겨주는 fgets를 사용하는 것이 안전합니다. 키보드 입력이라면 파일 디스크립터를 stdin을 사용하면 됩니다.

C언어 gets() 함수 예제

gets()의 예제인데요, 문자열을 받는 버퍼 크기가 20byte인데도 그 이상으로 입력해도 출력되거나 에러가 발생합니다.

#include <stdio.h>

int main( void)
{
   char   buff[20];

   while( NULL != gets( buff)){
      printf( "%s\n", buff);
   }
   printf( "quit\n");

   return 0;
}

C언어 gets() 예제 실행

]$ ./a.out
badayak.com
badayak.com
jwmx.tistory.com
jwmx.tistory.com
badayak.com jwmx.tistory.com          <- 버퍼 크기보다 큰 문자열 입력
badayak.com jwmx.tistory.com          <- 문자열이 출력된다고 해도 비정상
quit                            <- Ctrl-D 키 누름 
+++ stack smashing detected +++: ./a.out terminated
중지됨 (core dumped)
]$

예제 gets()를 fgets()로 대용

버퍼 크기보다 큰 문자열을 입력해도 버퍼 크기별 나누어서 입력받아 출력합니다.

#include <stdio.h>
#include <string.h>

int main( void)
{
   char   buff[10];

   while( 1){
      bzero( buff, sizeof( buff)); 
      if ( 0 == fgets( buff, sizeof( buff), stdin) ){
          break;
      }           
      printf( "%s\n", buff);
   }
   printf( "quit\n");

   return 0;
}

get()를 fgets()로 대용 예제 실행 결과

]$ ./a.out
badayak.com
badayak.com badayak.com badayak.com badayak.com  <- 긴 문장을 입력 
badayak.c
om badaya
k.com bad
ayak.com
badayak.c
om
                   <- Ctrl-C 키 누름 
^C
]$
SNS 공유하기
💬 댓글 개
최근글
이모티콘창 닫기
울음
안녕
감사해요
당황
피폐

이모티콘을 클릭하면 댓글창에 입력됩니다.