|
2008-04-01-마술감자 명국진 (http://magicpotato.com http://xyz2.net) 원문 : http://xyz2.net/bbs/zboard.php?id=notes&no=76 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); 참고. strcpy_s()를 사용하면 버퍼 크기를 넘어서는 데이터를 넘을 때 자동으로 막아준다고 착각하는 경우가 있다. (strncpy처럼) strcpy_s()에 넘기는 2번째 인자인 dest_size는 '내가 이 정도까지만 복사하고싶다'의 의미가 아니라 '여기 지정한 크기를 넘어서 복사하려고 하면 프로그램을 멈추고 에러창을 띄워라' 의 의미로 보아야 한다. // 이 코드는 이쁘게 dest에 1234567까지만 복사해 주는 것이 아닌, 프로그램을 뻗게 하는 코드다. char dest[8]; strcpy_s(dest, _countof(dest), "123456789"); 연장해서 sprintf_s() 와 _snprintf_s() 에도 똑같이 적용된다. sprintf_s(buf, _countof(buf), "%s 1234567", "1212"); // 프로그램 오류를 내는 코드 _snprintf_s(buf, _countof(buf), _countof(buf), "123456789%d", 121212); // strncpy_s()와 같은 이유로 오류를 내는 코드 _snprintf_s(buf, _countof(buf), _countof(buf)-1, "1234567%d", 121212); // 정상적으로 작동하며, 이렇게 써야 하는 코드 * gpg의 비회원님의 내용 추가 - 보충 감사드립니다. strncpy_s(), _snprintf_s() 함수의 복사하고 싶은 길이(size_t count)에 _TRUNCATE 를 넣으면 수용가능한 버퍼 크기(size_t sizeOfBuffer)에 지정한 값 -1 을 넣은것과 같게 동작한다. |