728x90
반응형

strcpy() 와 strncpy() 의 차이점에 대해서 정리해보았다.

 

strcpy()  strncpy() 문자열을 복사해주는 함수다.
두 함수는 string.h 헤더 파일에 선언되어 있다.

 

우선, 두 함수의 원형을 확인해보자.

char* strcpy(char* destination, const char* source);
char* strncpy(char* destination, const char* source, size_t num);

 

두 함수의 원형을 알 수 있듯이 다른 점은 strncpy() 함수는 복사할 문자열의 길이를 지정할 수 있다는 것이다.
그 외에도 다음과 같이 각 함수의 특징을 알 수 있다.

 

strcpy() 함수 null byte를 포함하는 src문자열을 dest 버퍼에 복사한다. 즉, 출력할 때 null byte 까지만 출력해준다.
null byte 이후에 값이 들어 있어도 null byte 까지를 하나의 문자열로 인식한다.

 

실제로 null byte 이후의 값을 출력해보면 들어있는 것을 확인할 수 있다.
사용 시 유의해야 할 점은 destination source 의 메모리는 겹치지 않아야 하고
destination 버퍼는 source 문자열을 복사하기에 충분한 사이즈여야 한다는 것이다. 그렇지 않다면 오버플로우가 발생한다.

 

strncpy() 함수 src 문자열을 num byte만큼 복사하는 것을 제외하면 strcpy() 함수와 같다.
strncpy() 함수의 경우 source 의 문자열 크기가 num byte보다 작다면 destination 함수의 마지막에 추가로 num byte 만큼 null byte로 모두 초기화 해준다.

 

그러면 strcpy() 와 strncpy() 둘 중에 어떤 함수를 사용하는 것이 좋을까?

 

여러 블로그를 돌아다니면서 여러 정보들을 들여다 본 결과
그럼 strcpy()  strncpy() 중에서 추천하는 것은 strncpy() 함수를 사용해야 한다고 생각한다.
strcpy() 함수의 경우 복사할 문자열의 길이에 따라서 오버플러우가 발생할 수 있다.

 

[참고 1] 에서 보는 것과 같이 복사할 문자열(s1) 보다 크기가 작은 문자열(s3)  strcpy() 함수를 사용해서 문자열을 복사하게 되면
 \0 까지의 문자열을 복사하기 때문에 크기가 작지만 결과는 문자열 전체가 복사된 것을 확인할 수 있다.

 

이런 부분에서 오버플로우가 발생한다는 것이다.
물론 null 문자를 알아서 가져오기 때문에 프로그래머들의 실수를 방지해줄 수 있는 부분도 있다.
하지만 null 문자가 포함되지 않은 문자를 가져오게 되면 프로그램의 심각한 오류가 발생할 수 있다는 것을 알아야 한다.
반면에 strncpy() 함수는 복사할 대상의 크기를 미리 지정해놓고 복사하기 때문에 오버플로우를 사전에 방지할 수 있다고 생각한다.

 

그렇다고 strncpy() 함수가 반드시 안전하다고는 할 수 없다.
다만 strcpy() 함수보다 영향을 덜 준다는 부분에서 strncpy() 함수를 사용해야 한다고 생각한다.

 

 

- 참고 사이트 - 

dojang.io/mod/page/view.php?id=358

 

C 언어 코딩 도장: 42.1 문자열 복사하기

42 문자열을 복사하고 붙이기 이번에는 문자열을 다른 곳으로 복사하는 방법과 두 문자열을 붙이는 방법을 알아보겠습니다. 42.1 문자열 복사하기 문자열은 다른 배열이나 포인터(메모리)로 복사

dojang.io

blockdmask.tistory.com/348

 

[C언어/C++] strcpy, strncpy 함수(문자열 복사)에 대해서

안녕하세요. BlockDMask 입니다. 오늘은 C 스타일의 문자열인 char*, char[] 타입의 문자열을 복사하는 함수 두가지에 대해서 알아 볼 것 입니다. 두 함수는 바로 strcpy, strncpy 입니다. 이 두함수가 무슨

blockdmask.tistory.com

jhnyang.tistory.com/171

 

[C언어]문자열 복사 함수 strcpy, strcnpy와 주의사항, 널문자 (null) - string.h 라이브러리 파헤치기

[C언어, C++언어 완전정복 목차 링크!] 안녕하세요~! 저번 시간 strlen, strtok 함수에 이어서 string.h 라이브러리에 속한 또 다른 함수 중 하나를 살펴보려고 합니다. 오늘은 매우매우 보편적이고 기본

jhnyang.tistory.com

coding-factory.tistory.com/591

 

[C언어/C++] 문자열 복사하기 strcpy, strncpy 함수 사용법 & 예제 + 구현

C언어에서 문자열을 복사하고 싶다면 strcpy이나 strncpy함수를 사용하시면 됩니다. 두 함수의 차이는 복사할 문자열의 길이를 설정하느냐만 다를 뿐 기본적으로 문자열을 복사한다는 것은 같습니

coding-factory.tistory.com

debuglog.tistory.com/113

 

strcpy와 strncpy

strcpy와 strncpy strcpy와 strncpy는 문자열을 복사하는 함수로 알고 있음 둘의 차이를 몇 가지 예시를 통해 알아보고자 함 1. 복사 범위 char dest[20] = "Hello, World!"; char src[20] = "Banana"; ​ strcpy(..

debuglog.tistory.com

dragonterry.tistory.com/entry/strcpy-%EC%82%AC%EC%9A%A9%EC%9D%98-%EB%AC%B8%EC%A0%9C%EC%A0%90

 

strcpy 사용의 문제점

안그래도 strcpy 때문에 검색질 하다가 좋은 글이 있어서 담아왔다. 그래도 strcpy를 쓰는 이유는 지가 알아서 '\0'을 붙여주기 때문에 프로그래머의 실수를 다소 방지해줄 수 있기 때문이다.  memcpy

dragonterry.tistory.com

forum.falinux.com/zbxe/index.php?mid=lecture_tip&page=35&document_srl=796402

 

강좌와 팁 - gets, strcpy, sscanf를 왜 사용하지 말라고 하죠?

 

forum.falinux.com

aiw73.tistory.com/16

 

strcpy strncpy 설명, 비교

문자열을 복사하는 함수 strcpy, strncpy #include char *strcpy(char *dest, cont char *src); int main(){ char str1[20]="Hello World"; char str2[20]; strcpy(str2, str1); puts(str2); } 결과 >> Hello Wor..

aiw73.tistory.com

iamgus.tistory.com/160?category=883480

 

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

자바나 C#계열 언어는 String 자료형이 있어서, 문자 A를 B에 복사한다면 "B = A" 이런 식으로 대입을 한다. 반면 C언어는 String 타입이란 게 없어서 이렇게 대입할 경우 원하는 결과가 나오지 않는다.

iamgus.tistory.com

 

728x90
반응형
복사했습니다!