Core Programming/C Standard Library: Resource & Performan

C언어 문자열 함수 총정리: strlen, strcpy, strncpy 안전한 사용법

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

C언어에서 문자열은 독립된 자료형이 아닌 '널 문자(\0)로 끝나는 문자 배열'입니다. 이 배열을 효율적으로 다루기 위해 반드시 익혀야 하는 것이 바로 <string.h> 헤더 파일입니다.

오늘은 문자열 처리의 기초이자 실무에서 가장 많이 쓰이는 길이 측정(strlen)과 안전한 복사(strcpy, strncpy)에 대해 완벽하게 정리해 보겠습니다.

Generated by Gemini AI.


1. <string.h> 헤더 파일 개요

<string.h>는 문자열 조작을 위한 표준 함수들을 담고 있습니다. 단순히 문자를 복사하는 것부터 특정 문자를 찾는 기능까지 다양한 API를 제공합니다.

주요 기능 요약

  • 길이 측정: strlen
  • 복사 및 이동: strcpy, strncpy, memcpy
  • 결합 및 비교: strcat, strcmp
  • 검색 및 분할: strchr, strstr, strtok

2. strlen: 문자열의 진짜 길이는?

strlen 함수는 문자열의 시작부터 널 문자(\0) 직전까지의 문자의 개수를 세어 반환합니다.

2.1 예제 및 특징

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

int main() {
    char str[] = "Hello"; // 'H','e','l','l','o','\0' 총 6바이트 저장
    size_t length = strlen(str); // 널 문자를 제외한 5 반환
    
    printf("문자열 길이: %zu\n", length);
    return 0;
}
  • 자료형: 반환형인 size_t는 부호 없는 정수형으로, 메모리 크기를 나타내는 데 최적화되어 있습니다.
  • 시간 복잡도: 처음부터 끝까지 스캔하므로 문자열이 길어질수록 처리 시간이 늘어나는 O(n) 방식입니다.

3. strcpy vs strncpy: 안전한 복사 방법

문자열 복사 시 가장 주의해야 할 점은 '대상 버퍼의 크기'입니다.

3.1 strcpy (단순 복사 - 주의 필요)

원본 문자열을 대상 배열로 그대로 복사합니다. 널 문자(\0)까지 복사하지만, 대상 배열이 원본보다 작으면 버퍼 오버플로우가 발생하여 프로그램이 비정상 종료되거나 보안 취약점이 생길 수 있습니다.

C
 
char source[] = "Learning C";
char dest[20];
strcpy(dest, source); // dest의 크기가 충분한지 항상 확인해야 함

3.2 strncpy (길이 지정 복사 - 권장)

복사할 최대 길이를 지정하여 버퍼 오버플로우를 방지하는 안전한 대안입니다.

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

int main() {
    char src[] = "Safe Programming";
    char dest[10];

    // 버퍼 크기보다 1 적게 복사하여 마지막에 널 문자가 들어갈 자리를 확보합니다.
    strncpy(dest, src, sizeof(dest) - 1);
    dest[sizeof(dest) - 1] = '\0'; // strncpy는 널 문자를 자동으로 붙이지 않을 수 있습니다.

    printf("결과: %s\n", dest); // 출력: Safe Pro
    return 0;
}

4. 함수 한눈에 비교하기

함수 주요 기능 핵심 주의사항
strlen 문자열 길이 측정 NULL 포인터 전달 시 런타임 에러 발생
strcpy 문자열 전체 복사 대상 버퍼 크기 미체크 (보안 취약점 위험)
strncpy 지정된 길이만큼 복사 마지막 널 문자(\0) 수동 추가 필수

5. 마무리: 안전한 문자열 처리를 위한 팁

  1. 배열 크기 확보: 복사 시에는 항상 (문자열 길이 + 1) 만큼의 공간이 있는지 확인하세요.
  2. strncpy 활용: 실무 환경에서는 보안을 위해 strcpy보다 strncpy 사용을 강력히 권장합니다.
  3. 동적 할당 주의: malloc으로 생성된 문자열을 다룰 때는 반드시 마지막 널 문자의 존재를 잊지 마세요.

C언어의 문자열 처리는 단순해 보이지만 메모리 관리의 기초가 담겨 있습니다. 오늘 배운 내용을 직접 코드로 구현해 보며 감을 익혀보시기 바랍니다!


포스팅이 도움이 되셨다면 하트(♥)와 댓글 부탁드립니다!

임베디드 소프트웨어 및 최적화 기법에 대한 전문적인 정보는 'Coding by Head' 블로그에서 계속됩니다.

https://coding-by-head.tistory.com/

반응형