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 |