C-스타일 문자열

C-스타일 문자열 구조

문자 배열, 문자열 리터럴, 입출력, 관련 함수는 모두 마지막의 null 문자 '\0'을 기준으로 길이를 판단한다. 배열 크기와 종료 문자를 따로 보지 않으면 버퍼 초과와 잘린 출력이 생긴다.

문자 배열 char buf[8];

배열은 칸 수만 보장한다. 문자열로 쓰려면 마지막에 종료 문자를 넣을 공간까지 확보해야 한다.

문자열 리터럴 "ABC" == A B C '\0'

리터럴에는 종료 문자가 자동으로 붙는다. 그래서 필요한 배열 크기는 보이는 글자 수보다 하나 더 크다.

종료 문자 strlen(buf)

문자열 함수는 배열 전체가 아니라 '\0'을 만날 때까지의 구간을 문자열로 해석한다.

안전한 입력 std::string line;

길이가 변할 수 있는 입력은 std::string으로 받고, C API에 넘길 때만 c_str() 경계를 확인한다.

길이 계산

sizeof(arr)는 배열 칸 수, strlen(arr)은 종료 문자 전까지의 문자 수다.

복사/붙이기

대상 버퍼에 결과 문자열과 종료 문자가 모두 들어가는지 먼저 계산한 뒤 복사해야 한다.

출력

종료 문자가 없으면 출력 함수가 배열 밖 메모리까지 문자열로 읽을 수 있다.

C++ 대안

소유와 길이 관리는 std::string에 맡기고, 고정 크기 버퍼가 필요한 경계에서만 C 스타일 문자열을 다룬다.

판단 기준

C 스타일 문자열을 보면 먼저 “배열 크기, 실제 문자 수, 종료 문자 위치”를 분리해서 확인한다.