문자열 변수에서 문자열 변수로 복사하는 함수로 strcp()가 있습니다. 사용하기 매우 편하지요.

 

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

int main( void)
{
   char  str_buffer[50];
  
   ptr = strcpy( str_buffer, "forum.falinux.com");

   return 0;
}

 

strcpy() 보다 더 편한 함수가 있습니다. 바로 sprintf()입니다. 포맷에 맞추어 문자열을 만들 수 있기 때문입니다.

 

sprintf( ptr, "%d %x %s", 123, 123, "forum.falinux.com");

 

그러나 이 두 함수는 편하기는 하지만 제대로 사용하지 않으면 프로그래머를 매우 괴롭히는 고약한 모습으로 바뀝니다. 이유는 간단합니다. 두 함수 모두 저장 대상의 변수가 가지고 있는 메모리 공간의 크기를 염두하지 않고 지시한 대로 처리하기 때문입니다.

 

특히, 통신으로 다른 사람이 보내 준 데이터의 바이트의 개수가 준비한 버퍼의 크기보다 항상 작다는 것이 보장되지 않는다면, 평상 시 잘 되는 프로그램이 아상하게 중간에 죽어 버리는 경우 같은 안타까운 일이 발생하게 됩니다.

 

상황이 자신이 없을 때에는 strcpy() 대신에 memcpy()를 대신 사용합니다.

 

#define BUFF_SIZE   1024

char    buff[BUFF_SIZE];


           :

memset( buff, 0, BUFF_SIZE);
memcpy( buff, pdata, BUFF_SIZE);

만일 버퍼로 수신한 데이터가 반드시 NULL 로 끝나야 한다면, 예를 들어 printf() 나 fputs()를 사용할 경우라면 아래와 같이 버퍼 보다 하나 적게 복사합니다.

 

memset( buff, 0, BUFF_SIZE);
memcpy( buff, pdata, BUFF_SIZE-1);

 

그렇다면 sprintf()는 어떻게 사용해야 안전할까요? 답은 따로 없습니다. 안전하게 사용하십시오. ^^;