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

C 표준 라이브러리 string.h 개요 및 문자열 관련 함수 (strlen, strcpy, strncpy)

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

C 언어에서 문자열 처리는 표준 라이브러리 <string.h>를 통해 제공됩니다. string.h는 문자열을 다루는 다양한 함수들을 포함하고 있으며, 이를 활용하면 문자열의 길이를 측정하거나 복사하는 등의 작업을 쉽게 수행할 수 있습니다.

이번 포스팅에서는 string.h의 개요와 함께 문자열 관련 주요 함수 중 strlen, strcpy, strncpy에 대해 살펴보겠습니다.


1. <string.h> 개요

<string.h>는 문자열과 관련된 다양한 함수를 포함하고 있는 헤더 파일입니다. 이 헤더 파일에 정의된 함수들은 다음과 같은 작업을 수행할 수 있습니다.

  • 문자열 길이 측정 (strlen)
  • 문자열 복사 (strcpy, strncpy)
  • 문자열 연결 (strcat, strncat)
  • 문자열 비교 (strcmp, strncmp)
  • 특정 문자 찾기 (strchr, strrchr)
  • 문자열 검색 (strstr)
  • 문자열 분할 (strtok)

그럼 이제 문자열의 길이를 측정하는 strlen과 문자열을 복사하는 strcpy, strncpy에 대해 구체적으로 알아보겠습니다.


2. strlen 함수 (문자열 길이 측정)

2.1 strlen 함수 개요

strlen 함수는 문자열의 길이를 반환하는 함수입니다. 단, 문자열의 끝을 나타내는 \0(널 문자)은 포함하지 않습니다.

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

int main() {
    char str[] = "Hello, World!";
    size_t length = strlen(str);
    printf("문자열 길이: %zu\n", length);
    return 0;
}

2.2 실행 결과

문자열 길이: 13

2.3 주의사항

  • strlenNULL 포인터에 대해 동작하지 않습니다.
  • strlen 함수는 O(n)의 시간 복잡도를 가집니다.
  • 문자열 끝(\0)을 포함하지 않고 길이를 계산합니다.

3. strcpy 함수 (문자열 복사)

3.1 strcpy 함수 개요

strcpy 함수는 한 문자열을 다른 문자열로 복사하는 함수입니다.

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

int main() {
    char source[] = "Hello, C!";
    char destination[20];

    strcpy(destination, source);

    printf("복사된 문자열: %s\n", destination);
    return 0;
}

3.2 실행 결과

복사된 문자열: Hello, C!

3.3 주의사항

  • destination 크기가 충분히 크지 않으면 버퍼 오버플로우가 발생할 수 있습니다.
  • strcpy는 널 문자를 포함하여 복사하므로, destination은 반드시 충분한 공간을 가져야 합니다.

4. strncpy 함수 (지정된 길이만큼 문자열 복사)

4.1 strncpy 함수 개요

strncpy 함수는 strcpy와 유사하지만, 최대 n개의 문자만 복사할 수 있는 안전한 함수입니다.

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

int main() {
    char source[] = "Hello, C programming!";
    char destination[10];

    strncpy(destination, source, sizeof(destination) - 1);
    destination[sizeof(destination) - 1] = '\0'; // 널 문자 추가

    printf("복사된 문자열: %s\n", destination);
    return 0;
}

4.2 실행 결과

복사된 문자열: Hello, C

4.3 주의사항

  • strncpy는 널(\0) 문자를 자동으로 추가하지 않기 때문에 직접 destination[n-1] = '\0'; 처리가 필요할 수 있습니다.
  • strncpy는 남은 공간을 자동으로 \0로 채우지 않으므로, 필요 시 수동으로 초기화해야 합니다.

5. 정리

함수 기능 주의할 점
strlen 문자열의 길이를 구함 \0을 포함하지 않음, NULL 포인터 처리 불가
strcpy 문자열을 복사 버퍼 오버플로우 위험
strncpy 지정된 길이만큼 문자열을 복사 \0 자동 추가되지 않음

string.h를 활용하면 문자열을 다룰 때 매우 편리하지만, 메모리 관리를 신중하게 해야 합니다. 특히 strcpy와 같은 함수는 버퍼 오버플로우의 위험이 있기 때문에 항상 충분한 공간을 확보하고 strncpy와 같은 안전한 대안을 고려해야 합니다.

반응형