strncpy의 안정적인 사용법

strncpy( 목적지 buffer, 원본 pointer, sizeof( 목적지 buffer ) - 1 );
목적지 buffer[ sizeof( 목적지 buffer ) -1 ] = '\0';


strcpy

#include <string.h> 
char *strcpy(char *dest, const char *src);

  src가 가르키는 문자열을 dest가 가르키는 배열에 복사한다. src에서 복사될때 '\0' 까지 복사됨으로 문자열이 겹쳐지지는 않는다. 이때 dest는 src를 모두 복사 받을수 있을정도로 충분히 커야 한다.

strcpy()는 목적지의 배열의 크기가 충분히 크지 않을경우 어떤일이 발생될지 알 수가 없다. 운이 좋으면 세그먼트폴트 에러와 함께 죽겠지만, 그렇지 않고 알수 없는 작동을 할 수도 있다. 이는 흔히 말하는 버퍼 오버 플로우 크래커 기술에 매우 취약하다. strcpy()를 쓰기전에는 반드시 복사할 문자열의 크기를 검사해주어야 한다. 또는 strncpy()를 써야 한다.

반환값: 목적지 문자열 dest에 대한 포인터를 반환한다.

예제:

#include <string.h>
int main(int argc, char *argv[], char evnp[])
{
  char buffer[20];

  strcpy(buffer, "hello world");
  printf("%s\n", buffer);

  strcpy(buffer, "naver blog");
  printf("%s\n", buffer);

return 0;
}


원형:
static void strcpy(char *s, char *t)
{
     while ((*s = *t) !='\0')
    {
           s++;

            t++;
    }

    *s = '\0';
}

strncpy

#include <string.h>
char *strncpy(char *dest, const char *src, size_t n);

src가 가르키는 문자열을 dest가 가르키는 배열에 복사한다. src에서 복사될때 '\0' 까지 복사됨으로 문자열이 겹쳐지지는 않는다. 이때 dest는 src를 모두 복사 받을수 있을정도로 충분히 커야 한다.

strncpy()는 n을 이용해서 복사할 문자열의 크기를 정할 수 있으므로 버퍼 오버 플로우에 좀더 안전하다. 만약 src의 길이가 n 보다 작다면 dest의 남는 공간은null 로 채워진다.

반환값: 목적지 문자열 dest에 대한 포인터를 반환한다.

예제:

#include <string.h>
int main(int argc, char *argv[], char evnp[])
{
  char buffer[25];

  strncpy(buffer, "hello world", 25);
  printf("%s\n", buffer);


//strset(buffer, 0); //buffer 초기화
  strncpy(buffer, "naver blog", 5);
  printf("%s\n", buffer);

return 0;
}


strcpy(dest, src);과 strncpy(dest, src, sizeof(dest)-1); 은 절대 같지 않다.

  strcpy는 src의 널문자를 자동으로 복사하지만 (버퍼 오버플로우는 논외) strncpy는 파라미터 n개만 복사하고 널을 붙이지 않는다. 다만 src의 길이가 n보다 짧다면 dest에 갖다붙인 src뒤로 인덱스 n-1까지는 널로 채워준다.

  즉, 파라미터로 넘긴 n개 까지는 자기가 책임지지만,   만약 src의 길이가 딱 n개이거나 n보다 큰 경우에는 destination의 끝에 널이 붙지 않는다. 때문에 strncpy(dest, src, sizeof(temp)-1);문 다음행에 dest[sizeof(dest)-1]=0;을 반드시 추가한다.

#include <string.h>
int main(int argc, char *argv[], char evnp[])
{
  char buffer[25];  

  strncpy(buffer, "naver blog1", 7);
  printf("%s\n", buffer);   //naver b[儆儆儆儆儆儆儆儆儆儆儆儆??]쓰레기 값

  strncpy(buffer, "naver blog2", sizeof(buffer)-1);
   printf("%s\n", buffer);   //naver blog2

   strncpy(buffer, "naver blog3", 7);
   printf("%s\n", buffer);   ////naver b[log2]이전의 버퍼 값

   strcpy(buffer, "hello world");
   printf("%s\n", buffer);

  return 0;
}


출처 : http://blog.naver.com/cidsang/20032605

2006/08/16 03:17 2006/08/16 03:17

글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

덧글을 달아 주세요