Programming/Win32 API2008. 12. 1. 15:46
이 역시 생각지도 못한 버그를 만들어 오랫동안 골치를 썩였기에 여러분은 이러지 마시라고 올립니다.

LPTSTR lstrcpyn(
 LPTSTR lpString1,  // destination buffer
 LPCTSTR lpString2, // string
 int iMaxLength     // number of characters to copy ★
);

★ 중요한 건 3번째 인자인데 예를 들면
   lstrcpyn(buf, "abcdef", 3); 하면 buf 는 "abc"가 아니라 "ab" 가 된다는 것입니 다.
   즉 주석에는 number of characters to copy 라고 되어있지만 ★ 이 안에 null 을 위한 갯수가 포함되어있음을 주의해야 합니다.

★ 이 세번째 인자는, 주석을 읽어보면 얼핏 "몇 글자를 copy할 것인가" 를 말하는 것처럼 보이지만,
   이보다는 buffer의 한계를 넘어 copy되지 못하도록 보호벽을 치는 의미이므로,
   copy할 문자열이 아닌 "buffer의 사이즈"와 연관지어 생각해야 합니다.
- 다음과 같이 사용.
      CHAR buf[256];
      lstrcpyn(buf, "복사할 문자열", 256); // 자동으로 NULL을 고려하여 실제로 255개 까지만 copy됨.

★ 참고로 표준 c runtime library 의 strncpy 는 이렇지 않음.
   strncpy(buf, "abcdef", 3); 하면 buf 는 "abc" 임.
- 이 경우는 다음과 같이 사용.
      char   buf[256];
      strncpy(buf, "복사할 문자열", 255); // buf가 포함할 수 있는 최대 길이 - 1 (NULL 고려해 주어야 함)
Posted by skensita