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

C++에서 std::string을 const char* 또는 char*로 변환하는 방법

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> 같은 컨테이너를 활용하면 더 안전하게 메모리를 관리할 수 있습니다.