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

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

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[]로 반드시 해제하는 것도 잊지 마세요.