본문 바로가기
코드리뷰/C언어 리뷰

[실전 C언어 코딩 리뷰] - 문자열 복사하기[memcpy() vs strncpy()]

by 디마드 2020. 10. 3.

C 개발할 때 memcpy와 strncpy 함수의 차이를 정확하게 모른 채 사용하는 경우가 많다. 둘 다 비슷한 결과를 출력되고 성능에도 큰 차이를 느끼지 못하기 때문이다. 

memcpy 함수가 메모리 자체를 빠른 속도로 복사하기 위해 만들었다면, strncpy 함수는 문자열 자체를 복사하기 위해 만들어졌다. 따라서 주로 이진 데이터는 memcpy 함수를 이용해 처리하고, 일반적인 문자열 처리는 strncpy 함수를 사용한다. 

memcpy는 레지스터를 사용하므로 처리 속도가 월등히 빠르고, 문자열 종료 문자인 null 여부를 확인하지 않고 정해진 길이 만큼 복사를 한다. 이 부분이 strncpy()와 다른 점이다. 따라서 memcpy 함수를 이용해 문자열을 복사할 경우 종료 문자가 제대로 붙었는지 반드시 확인을 해야 한다. 

 

memcpy() 헤더 파일 : string.h

#include <string.h>

void* memcpy(void* destination, const void* source, size_t num);

source 가 가리키는 위치에서 num 바이트 만큼 destination 이 가리키는 곳에 복사한다. source, destination 타입이 모두 void형이란 점에 유의하자.

실전 예제 : memcpy()

[샘플코드]

#include <stdio.h> 
#include <string.h> 
int main() { 
  char str1[13+1] = "Sample String"; 
  char str2[13+1]; 
  char str3[13+1]; 
     
  str1[6] = 0x00;            // null 종료문자 입력
   
  printf("[memcpy 출력]\n"); 
  memcpy(str2, str1, 14);      // memcpy는 Null과 상관없이 정해진 길이만큼 복사한다. 
  for (int i=0;i<13;i++) 
      printf("str2[%i]:[%c]\n",i,str2[i]); 
     
  printf("\n[strncpy 출력]\n"); 
  strncpy(str3, str1, 14);     // strncpy는 정해진 길이 또는 Null을 만날때까지 복사한다. 
  for (int i=0;i<13;i++) 
      printf("str3[%i]:[%c]\n",i,str3[i]);    
  
  return 0; 
}

[실행결과]

[memcpy 출력]
str2[0]:[S]
str2[1]:[a]
str2[2]:[m]
str2[3]:[p]
str2[4]:[l]
str2[5]:[e]
str2[6]:[]
str2[7]:[S]
str2[8]:[t]
str2[9]:[r]
str2[10]:[i]
str2[11]:[n]
str2[12]:[g]

[strncpy 출력]
str3[0]:[S]
str3[1]:[a]
str3[2]:[m]
str3[3]:[p]
str3[4]:[l]
str3[5]:[e]
str3[6]:[]
str3[7]:[]
str3[8]:[]
str3[9]:[]
str3[10]:[]
str3[11]:[]
str3[12]:[]

 

반응형

댓글