336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

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); // 정상적으로 작동하며, 이렇게 써야 하는 코드


출처 : http://gpgstudy.com/forum/viewtopic.php?p=97501

'Programming > C / C++' 카테고리의 다른 글

레지스트리의 값 가져오기  (0) 2015.02.07
# 과 ##  (0) 2015.02.07
함수 포인터 typedef  (0) 2015.02.07
enum, 보다 나은 enum  (0) 2015.02.07
vector 와 map 의 erase 를 할때 주의점  (0) 2015.02.07
Posted by 역시인생한방
,