아카이빙/C, C++

strcpy와 strncpy

셩님 2018. 5. 27. 02:44

strcpy와 strncpy

strcpy와 strncpy는 문자열을 복사하는 함수로 알고 있음

둘의 차이를 몇 가지 예시를 통해 알아보고자 함


1. 복사 범위

char dest[20] = "Hello, World!";
char src[20] = "Banana";

strcpy(dest, src);

printf("%s\n", dest, src);

for (int i = 0; i < 20; i++) {
   printf("%c", dest[i]);
}
  • printf("%s\n", dest)로 출력하면 Banana가 나와서 잘 복사되었나 싶지만,

  • 캐릭터를 하나씩 출력해보면 Banana World!가 나온다.

  • dest에 복사되는 범위는 "Banana"와 '\0' 까지만 복사되고 나머지는 그대로 남아있다.

  • 즉, strcpy는 NULL문자를 만나기 전까지만 복사된다.


strncpy(dest, src, sizeof(dest));

for (int i = 0; i < 20; i++) {
   printf("%c", dest[i]);
}
  • strncpy는 복사할 메모리의 크기를 지정해주므로, Banana가 출력된다.

  • 지정한 크기만큼 복사되므로, src의 0으로 채워진 공간도 모두 복사된다.

  • 여기까지는 strcpy(dest, src);는 strncpy(dest, src, strlen(src));와 같다고 볼 수 있다.


2. 버퍼 오버플로우

char dest[20] = "Hello, World!";
char src[40] = "Which team will win NBA finals 2018?";

//strcpy(dest, src); error!!
strncpy(dest, src, sizeof(dest) - 1);

printf("%s\n%s\n", dest, src);
  • 복사할 문자열의 크기가 그 대상의 크기보다 크다면 버퍼 오버플로우가 발생한다.

  • strncpy에서 sizeof(dest) - 1을 해주는 이유는 마지막 문자는 '\0'으로 끝나야 하기 때문이다. -1을 하지 않아도 에러는 발생하지는 않지만, 출력에서 원하는 결과가 나오지 않는다.


정리

  • strcpy는 복사할 문자열의 길이에 따라서 버퍼 오버플로우가 발생할 수 있으므로 사용하지 않는 게 좋다.

  • strncpy는 복사할 대상의 크기를 지정하기때문에, 실수를 미연에 방지할 수 있다.

  • 그러나 strncpy도 큰 사이즈를 넣을 경우, 에러가 날 수 있기때문에 완전히 안전하다고 할 수는 없다.


'아카이빙 > C, C++' 카테고리의 다른 글

malloc과 new의 차이  (0) 2018.05.27
struct와 class 차이  (0) 2018.05.27
string과 character 배열  (0) 2018.05.26
malloc, calloc, realloc, free  (0) 2018.05.26
sizeof 포인터  (0) 2018.05.26