출처 : https://gpgstudy.com/forum/viewtopic.php?t=19342
strncpy()는 복사되었으면 하는 문자열의 길이를 넘어서지 않게 복사해 준다.
그리고 대상 버퍼를 넘어서게 되면 NULL로 끝나지 않는 문자열까지 복사하게 된다. 예를 들면 아래와 같다.
strncpy(dest, 8, "1234567"); // dest == { '1', '2', '3', '4', '5', '6', '7', NULL }
strncpy(dest, 8, "12345678"); // dest == { '1', '2', '3', '4', '5', '6', '7', '8' }
strncpy_s() 는 대상 버퍼가 실제 수용가능한 크기와 복사되었으면 하는 문자열의 길이 두가지를 넘긴다.
strncpy()와 strncpy_s()의 다른점이 있다면 strncpy_s()는 '복사 되었으면 하는 문자열의 길이'를 넘어서서 복사를 할 때 마지막을 항상 NULL로 끝나게 해준다는 점이다.
다음과 같은 코드는 런타임 에러를 발생시킨다.
// 이 코드는 buf에 1, 2, 3, 4, 5, 6, 7, 8, NULL .. 총 9개의 문자열을 넣으려다가 에러가 나게 된다.
char dest[8];
strncpy_s(buf, _countof(buf), "123456789000", _countof(buf));
따라서 strncpy_s()를 사용할 때는 버퍼 크기와, 복사하고 싶은 길이를 다르게 주어야 한다.
char dest[8];
strncpy_s(buf, _countof(buf), "123456789000", _countof(buf)-1);
댓글에
strncpy_s(buf, _countof(buf), "123456789000", _TRUNCATE);
이것도 더 알아봐야.
'C++' 카테고리의 다른 글
String literal 스트링 상수는 괄호가 끝나도 사라지지 않아요~ (0) | 2017.09.18 |
---|---|
[비공개]string class 복사 시 참고하면 좋은 내용 (0) | 2017.09.08 |
strcpy_s 등 _s붙은 것들 특징, 문자열들 (1) | 2017.07.17 |
memcpy strncpy 차이 (0) | 2017.07.17 |
strcpy_s() 0xFD (0) | 2017.07.17 |