개인노트
[C언어] strcpy_s, strncpy_s 함수 - 문자열 복사 함수 본문
▶ 문자열을 복사하는 함수 - strcpy, strncpy ◀
#include <string.h> char * strcpy_s(char * dest, const char * src); // src의 문자열을 dest에 복사 char * strncpy_s(char * dest, const char * src, size_t n); // src > dest일 경우 문자열을 dest의 크기만큼만 복사 → 문자열의 주소값을 복사해서 반환한다. |
복사하는 두 배열의 크기가 같거나 복사되는 쪽이 크기가 크면 문제가 없다. 허나 복사되는 쪽의 크기가 작다면 문제가 된다.
밑의 소스중 복사되는 배열의 크기가 작은 경우 1을 보면 복사되는 str3의 크기가 str1보다 작아서 str3의 크기 만큼만 복사를 하기 위해 sizeof(str3)의 값을 넣어 보았지만 에러가 발생했다. 이유는 바로 NULL문자 때문이다.
문자열의 맨 끝에는 NULL값이 존재해야 문자열로 판단이된다. 하지만 strcpy_S, strncpy_s 함수는 무식하게 배열의 맨 앞부터 정해진 크기 만큼만 복사를 하기 때문에 맨 뒤에있는 NULL값은 복사가 되지 않는다.
그렇기 때문에 복사받을 배열의 크기 -1만큼만 복사를 받은 후 배열의 맨뒤를 NULL값으로 채워 주어야 한다.
#include <stdio.h> #include <string.h> int main(void) { char str1[20] = "Billnairk's blog"; char str2[20]; char str3[5];
/* 배열의 크기가 서로 같은 경우 */ strcpy_s(str2, str1); // str1의 값을 str2에 복사 puts(str2); /* 복사되는 배열의 크기가 작은 경우 1 strncpy_s(str3, str1, sizeof(str3)); str2의 크기만큼만 복사, BOF ERROR puts(str3);*/ /* 복사되는 배열의 크기가 작은 경우 2 */ strncpy_s(str3, str1, sizeof(str3)-1); str3[sizeof(str3)-1] = 0; // 문자열의 맨 마지막에 NULL값으로 초기화 puts(str3); } |
'C > 문법' 카테고리의 다른 글
[C언어] strcmp, strncmp 함수 - 문자열을 비교하는 함수 (0) | 2017.07.14 |
---|---|
[C언어] strcat_s, strncat_s 함수 - 문자열을 붙이는 함수 (0) | 2017.07.14 |
[C언어] 문자열의 길이를 반환하는 strlen 함수 (0) | 2017.07.14 |
[C언어] 표준 입출력 & 버퍼 (0) | 2017.07.14 |
[C언어] 문자열 단위의 입출력 함수 (0) | 2017.07.14 |