c 언어/c 표준 라이브러리(Standard C Library)

C 언어 `string.h`의 `strcat`과 `strncat` 함수 이해하기

임베디드 친구 2025. 2. 10. 00:38
728x90
반응형

C 언어에서 문자열을 다룰 때 필수적으로 사용되는 표준 라이브러리 <string.h>에는 다양한 문자열 처리 함수가 포함되어 있습니다. 그중 strcatstrncat 함수는 기존 문자열에 새로운 문자열을 이어붙일 때 사용됩니다.

이번 포스팅에서는 strcatstrncat 함수의 동작 방식과 차이점을 알아보고, 예제 코드를 통해 올바르게 사용하는 방법을 설명하겠습니다.

1. strcat 함수

strcat 함수는 첫 번째 문자열(dest)의 끝에 두 번째 문자열(src)을 추가합니다. 이때 dest의 끝에 src를 복사한 후, 널 문자(\0)를 자동으로 추가합니다.

strcat 함수의 선언

char *strcat(char *dest, const char *src);

strcat 함수의 동작 방식

  • dest 문자열의 끝(\0)을 찾습니다.
  • src의 내용을 dest의 끝에 복사합니다.
  • 마지막에 \0을 추가합니다.

strcat 함수 사용 예제

#include <stdio.h>
#include <string.h>

int main() {
    char dest[50] = "Hello, ";
    char src[] = "World!";

    strcat(dest, src);
    printf("결과: %s\n", dest);

    return 0;
}

실행 결과

결과: Hello, World!

strcat 사용 시 주의할 점

  • dest 배열의 크기가 충분하지 않으면 버퍼 오버플로우가 발생할 수 있습니다.
  • dest의 크기를 고려하지 않고 사용하면 메모리 오류가 발생할 수 있습니다.

2. strncat 함수

strncat 함수는 strcat과 비슷하지만, src에서 복사할 최대 길이를 지정할 수 있습니다. 이를 통해 버퍼 오버플로우를 방지할 수 있습니다.

strncat 함수의 선언

char *strncat(char *dest, const char *src, size_t n);

strncat 함수의 동작 방식

  • dest 문자열의 끝(\0)을 찾습니다.
  • src에서 최대 n개의 문자를 dest에 복사합니다.
  • 마지막에 \0을 추가합니다.

strncat 함수 사용 예제

#include <stdio.h>
#include <string.h>

int main() {
    char dest[20] = "Hello, ";
    char src[] = "World!";

    strncat(dest, src, 3);
    printf("결과: %s\n", dest);

    return 0;
}

실행 결과

결과: Hello, Wor

strncat 사용 시 주의할 점

  • n 값이 src의 길이보다 크더라도 src의 끝까지 복사되며, \0이 자동 추가됩니다.
  • dest의 남은 공간을 고려하여 n 값을 조정해야 합니다.
  • dest 크기보다 많이 복사하면 버퍼 오버플로우가 발생할 수 있습니다.

3. strcatstrncat 비교

함수 역할 복사 길이 제한 안전성
strcat 문자열을 추가 없음 버퍼 오버플로우 위험
strncat 문자열을 추가 있음 (n개까지) 상대적으로 안전

4. strncat을 사용할 때 주의할 점

C 언어의 문자열 처리 함수는 대부분 버퍼 크기를 직접 관리해야 하므로, strncat을 사용할 때도 dest의 크기를 초과하지 않도록 주의해야 합니다.

아래 코드를 보면, strncat 사용 시 dest의 최대 크기를 고려하지 않으면 문제가 발생할 수 있습니다.

안전한 strncat 사용 예제

#include <stdio.h>
#include <string.h>

#define BUFFER_SIZE 20

int main() {
    char dest[BUFFER_SIZE] = "Hello, ";
    char src[] = "World!";

    // dest의 남은 공간을 계산하여 안전하게 복사
    size_t available_space = BUFFER_SIZE - strlen(dest) - 1;
    strncat(dest, src, available_space);

    printf("결과: %s\n", dest);

    return 0;
}

실행 결과

결과: Hello, World!

위 코드에서는 BUFFER_SIZE에서 strlen(dest)과 마지막 널 문자(\0)를 위한 1바이트를 제외한 available_space만큼만 strncat이 복사하도록 설정했습니다. 이렇게 하면 안전하게 문자열을 이어 붙일 수 있습니다.

5. 결론

strcatstrncat은 문자열을 연결할 때 유용한 함수지만, 잘못 사용하면 버퍼 오버플로우가 발생할 수 있습니다. 특히 strcat은 복사 길이 제한이 없으므로 항상 충분한 크기의 버퍼를 확보해야 합니다.

안전한 코드 작성을 위해 strncat을 사용할 때는 dest의 남은 공간을 고려하여 적절한 n 값을 지정하는 것이 중요합니다.

핵심 정리

  • strcat은 문자열을 단순히 연결하지만, 버퍼 크기를 초과할 위험이 있음.
  • strncat은 복사할 길이를 제한할 수 있어 상대적으로 안전함.
  • strncat 사용 시 dest의 남은 공간을 고려해야 함.

이번 포스팅이 strcatstrncat을 이해하는 데 도움이 되었길 바랍니다! 다음에도 유용한 C 언어 표준 라이브러리 함수에 대해 다뤄보겠습니다.

반응형