strcpy() vs. strncpy()
- strcpy()
strcpy 함수는 널 종단 문자 ('\0')를 만날 때까지
src 문자열의 전체 문자를 dst 문자열로 복사한다
만약 src 문자열의 길이가 dst 문자열의 버퍼 크기보다 크면,
버퍼 오버플로우가 발생할 수 있다
strcpy는 보통 null 종단 문자를 복사하지 않아도 되는 경우에 사용한다
- strncpy()
strncpy 함수는 두 번째 매개변수로 지정된 길이까지만 src 문자열을 dst 문자열로 복사한다
만약 src 문자열의 길이가 두 번째 매개변수로 지정한 길이보다 크면,
나머지는 null 종단 문자로 채워지지 않는다
명시적으로 지정된 길이까지만 복사하며 나머지는 null 종단 문자로 채우지 않기 때문에,
버퍼 오버플로우를 방지하는 데 유용합니다.
주의해야 할 것은 strncpy를 사용할 때 목표 버퍼의 길이를 정확히 지정해야 하며,
필요에 따라 null 종단 문자를 수동으로 추가해야 할 수 있다
strcpy() 구현
#include <stdio.h>
enum { LENGTH = 1024 };
void my_strcpy(char* dst, const char* src)
{
while (*src != '\0') {
*dst++ = *src++;
}
*dst = '\0';
return;
}
int main(void)
{
const char string[LENGTH] = "Hello, world!";
char cloned_string[LENGTH] = { 0, };
printf("string: %s\tcloned_string: %s\n", string, cloned_string);
my_strcpy(cloned_string, string);
printf("string: %s\tcloned_string: %s\n", string, cloned_string);
return 0;
}
위의 코드에서 구현된 my_strcpy 함수는
src 문자열이 끝날 때까지 문자를 dst에 복사한다
만약 dst 문자열의 길이가 src 문자열보다 작다면 NULL 문자까지 복사할 수 있으며,
이는 배열 경계를 초과하는 오버플로우 상황을 초래할 수 있다
따라서, 목표 문자열 dst의 크기를 미리 알 수 없는 경우,
함수를 호출하기 전에 dst의 크기를 확인하고 충분한 공간이 있는지 확인하는 것이 중요하다
혹은, strncpy와 같이 명시적으로 복사할 길이를 지정하는 방법을 사용하는 것이 좋고
이렇게 하면 목표 문자열의 크기를 초과하지 않도록 제어할 수 있다
'C > [코드조선] C 핵심' 카테고리의 다른 글
[C] strtolower(), strtoupper() (0) | 2024.02.10 |
---|---|
[C] strcat(), strstr(), strtok() (0) | 2024.02.10 |
[C] strcmp() (0) | 2024.02.09 |
[C] strlen() (0) | 2024.02.09 |
[C] 포인터 (0) | 2024.02.08 |