std::string을 C 스타일 문자열로 변환하기
C++ 프로그래밍을 하다 보면 std::string 객체를 C 스타일 문자열인 const char* 또는 char* 형태로 변환해야 하는 경우가 자주 발생합니다. 예를 들어, C 언어 기반의 라이브러리 함수나 구식 API를 호출할 때 C 스타일 문자열이 요구되기 때문입니다.
이러한 변환은 c_str() 함수 하나만으로 간단하게 처리할 수 있습니다. 이 함수는 문자열 객체의 현재 값을 나타내는 널 종료(null-terminated) 문자 시퀀스, 즉 C 문자열을 담고 있는 배열에 대한 포인터를 반환합니다.
c_str() 함수 선언
std::string::c_str의 선언은 다음과 같습니다.
const char* c_str() const;
이 함수는 문자열 객체의 현재 값을 나타내는 널 종료 문자 시퀀스(C 문자열)를 포함하는 배열에 대한 포인터를 반환합니다. 함수 호출 중 예외가 발생하더라도 원본 문자열은 전혀 변경되지 않습니다.
주의할 점
c_str()이 반환하는 포인터는 읽기 전용(const char*)이므로 직접 수정해서는 안 됩니다. 또한 원본 std::string 객체가 변경되거나 소멸되면 반환된 포인터는 더 이상 유효하지 않게 되므로 주의해야 합니다. 만약 수정 가능한 char* 형식이 필요하다면, 아래 예제처럼 새로운 버퍼를 할당한 뒤 strcpy로 복사하는 방식을 사용해야 합니다.
예제 코드
다음 예제는 c_str()을 활용해 문자열을 char* 배열로 복사한 후, strtok 함수로 공백 단위로 문장을 분리하여 출력합니다.
#include <iostream>
#include <cstring>
#include <string>
int main () {
std::string str ("Please divide this sentence into parts");
// 문자열 길이 + 널 문자 공간만큼 버퍼 할당
char * cstr = new char [str.length()+1];
std::strcpy (cstr, str.c_str());
// 공백을 구분자로 토큰 분리
char * p = std::strtok (cstr," ");
while (p!=0) {
std::cout << p << '\n';
p = std::strtok(NULL," ");
}
delete[] cstr;
return 0;
}실행 결과
Please divide this sentence into parts
정리
std::string을 C 스타일 문자열로 변환할 때는 c_str() 함수를 사용하면 됩니다. 읽기 전용으로 사용할 경우에는 반환된 포인터를 그대로 활용하고, 내용을 수정해야 하는 경우에는 반드시 별도의 메모리를 할당해 복사한 후 사용해야 합니다. 사용이 끝난 동적 메모리는 delete[]로 반드시 해제하는 것도 잊지 마세요.