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
coding-factory.tistory.com/591
dragonterry.tistory.com/entry/strcpy-%EC%82%AC%EC%9A%A9%EC%9D%98-%EB%AC%B8%EC%A0%9C%EC%A0%90
forum.falinux.com/zbxe/index.php?mid=lecture_tip&page=35&document_srl=796402
iamgus.tistory.com/160?category=883480
'스터디&교육 > 부스트코스 CS50 2기' 카테고리의 다른 글
[부스트코스 CS50] 6주차 심화 과정 💎 생각해보기 (0) | 2021.02.25 |
---|---|
부스트코스(Boostcourse) CS50 5주차 심화 과정 💎 생각해보기(4) (0) | 2021.02.19 |
부스트코스(Boostcourse) CS50 5주차 심화 과정 💎 생각해보기(2) (0) | 2021.02.19 |
부스트코스(Boostcourse) CS50 5주차 심화 과정 💎 생각해보기(1) (0) | 2021.02.19 |
부스트코스(Boostcourse) CS50 4주차 심화 과정 💎 생각해보기 (0) | 2021.02.03 |