Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C/C++ 널 종료 문자열(Null-Terminated String) 완벽 이해하기

널 종료 문자열이란?

C 언어에서 문자열은 본질적으로 문자(char)들의 배열입니다. C++의 std::string은 이러한 전통적인 문자 배열을 발전시킨 것으로, 크기 자동 관리, 연산자 오버로딩 등 추가적인 편의 기능을 제공합니다.

널 종료 문자열(null-terminated string)은 일련의 문자들로 구성되며, 마지막 요소가 반드시 널 문자('\0')로 끝나는 문자열을 의미합니다. 흥미로운 점은, 큰따옴표("...")를 사용해 문자열 리터럴을 작성하면 컴파일러가 자동으로 이를 널 종료 문자열로 변환한다는 것입니다.

널 문자와 문자열의 끝 처리

문자열의 실제 길이는 배열의 전체 크기보다 작을 수 있습니다. 특히 주의할 점은, 배열 내부 어디든 널 문자가 존재하면 그 위치가 곧 문자열의 끝으로 간주된다는 것입니다. 따라서 문자열 중간에 '\0'이 삽입되면, 그 이후의 내용은 무시됩니다.

예제 코드

다음 예제를 통해 이를 직접 확인해 보겠습니다. 먼저 std::string으로 하나의 문자열을 정의하고, 이후 동일한 문자열에 중간에 \0 문자를 삽입했을 때 출력 결과가 어떻게 달라지는지 살펴봅니다.

#include<iostream>
using namespace std;
main() {
    string my_string = "This is a sample text";
    cout << my_string << endl;
    my_string = "This is a sam\0ple text"; // \0 문자 확인
    cout << my_string;
}

실행 결과

This is a sample text
This is a sam

결과 분석

출력 결과를 보면, 두 번째 문자열은 "This is a sam"까지만 출력되고 그 뒤의 "ple text"는 사라진 것을 확인할 수 있습니다. 이는 문자열 중간에 삽입된 널 문자('\0')가 문자열의 끝을 표시하는 역할을 하기 때문입니다.

이러한 동작 방식은 C 스타일 함수(strlen, strcpy 등)에서도 동일하게 적용되므로, 문자열 데이터를 다룰 때 널 문자의 위치를 항상 염두에 두어야 합니다. 버퍼 오버플로우나 예기치 않은 데이터 손실을 방지하려면 널 종료 문자의 존재 여부를 꼼꼼히 확인하는 것이 좋습니다.