티스토리 뷰
☞ strcat, strncpy, strncat
<string.h>
char *strcat(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t size);
char *strncat(char *dest, const char *src, size_t size);
스트링 연결과 제한된 복사를 수행하는 함수들은 strcpy()와 유사하게 동작합니다. src로 지정한 스트링을 dest로 지정한 스트링의 끝이나 시작 지점에 복사하고 결과를 가지고 있는 dest 시작 위치를 리턴합니다.
strcat()은 dest 스트링에서 널문자를 찾아 해당 위치에 src의 문자열을 복사하는 것으로 만약에 dest의 길이나 끝 위치를 알고 있다면 굳이 strcat()를 사용하지 않더라도 끝 위치에 strcpy()로 복사하면 성능 낭비를 최소화 할 수 있습니다.
문제는 src로 지정한 문자열의 끝에 널문자가 없는 경우로 프로그램의 비정상 종료를 초래할 수 있으므로 주의를 기울여야 합니다.
strcpy()나 strcat()에서 src로 지정한 문자열에 널문자가 없어서 발생할 수 있는 문제를 예방할 수 있는 방법이 strncpy()와 strncat() 함수 입니다. 최대 길이로 size를 지정하는데 size 바이트까지 널문자가 없으면 해당 길이 만큼만 복사합니다.
주의할 점은 널문자를 만나지 못하고 복사가 중단되면 dest 문자열에도 널문자가 없는 상황이 될수 있으므로 감안해서 프로그래밍 해야 합니다.
☞ 예제
size_t strlcat(char *dst, const char *src, size_t siz) { char *d = dst; const char *s = src; size_t n = siz; size_t dlen; /* Find the end of dst and adjust bytes left but don't go past end */ while (n-- != 0 && *d != '\0') d++; dlen = d - dst; n = siz - dlen; if (n == 0) return (dlen + strlen(s)); while (*s != '\0') { if (n != 1) { *d++ = *s; n--; } s++; } *d = '\0'; return (dlen + (s - src)); }
위의 PostgreSQL DBMS 내부에서 사용하는 함수는 strcat을 보완한 함수로 길이 제한으로 복사를 중단하더라도 널을 붙여주고 최종 문자열의 길이를 리턴하는 코드로 만들었습니다. strlcat(destination, buf, sizeof(destination)); 와 같이 버퍼 크기를 최대치로 스트링 연결을 요청하면 스트링이 잘리더라도 버퍼를 초과하지도 않고 널문자도 확실히 붙여주는 안전성을 확보할 수 있게 되는 것입니다.
'C | C++' 카테고리의 다른 글
스트링 및 메모리 검색 (0) | 2018.05.31 |
---|---|
스트링과 메모리 비교 (0) | 2018.05.31 |
스트링/메모리의 복사와 이동 (0) | 2018.05.24 |
스트링/문자 배열의 이해와 길이 구하기 (0) | 2018.05.24 |
문자 다루기 (0) | 2018.05.24 |