이 역시 생각지도 못한 버그를 만들어 오랫동안 골치를 썩였기에 여러분은 이러지 마시라고 올립니다.
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 고려해 주어야 함)
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 고려해 주어야 함)