C++에서 std::string 객체를 C 스타일 문자열인 const char* 또는 char*로 변환해야 하는 경우가 자주 있습니다. 상황에 따라 적합한 변환 방법이 다르므로, 각 방법과 주의 사항을 예제와 함께 살펴보겠습니다.
c_str() 메서드로 const char* 얻기
string 클래스가 제공하는 c_str() 메서드를 사용하면 문자열 내용을 담고 있는 const char* 포인터를 손쉽게 얻을 수 있습니다. 반환되는 포인터는 널 종료 문자(\0)를 포함하며, 원본 문자열이 수정되거나 소멸되면 해당 포인터는 더 이상 유효하지 않다는 점에 유의해야 합니다.
예제
#include <iostream>
using namespace std;
int main() {
string x("hello");
const char* ccx = x.c_str();
cout << ccx;
}
출력 결과
hello
std::copy 함수로 char* 얻기
수정 가능한 char* 형태의 문자열이 필요하다면 c_str() 대신 복사 방식을 사용해야 합니다. 먼저 문자열 길이보다 1바이트 큰(널 종료 문자를 위한 공간) 메모리를 동적으로 할당한 뒤, std::copy 함수로 내용을 복사합니다.
예제
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
string x("hello");
// 메모리 할당 (널 종료 문자 공간 포함)
char* ccx = new char[x.length() + 1];
// 내용 복사
std::copy(x.begin(), x.end(), ccx);
ccx[x.length()] = '\0'; // 널 종료 문자 추가
cout << ccx;
delete[] ccx; // 사용 후 메모리 해제
}
출력 결과
hello
주의 사항
c_str()이 반환하는 포인터는 읽기 전용(const)이며, 원본string객체가 변경되거나 범위를 벗어나면 무효화됩니다.new로 할당한 메모리는 반드시delete[]로 해제해야 메모리 누수를 방지할 수 있습니다.- 복사 시 마지막에 널 종료 문자를 직접 추가해야 안전하게 문자열로 사용할 수 있습니다.
- C++11 이후에는 스마트 포인터나
std::vector<char>같은 컨테이너를 활용하면 더 안전하게 메모리를 관리할 수 있습니다.