C++에서 std::string을 char 배열로 변환해야 하는 경우가 자주 있습니다. 파일 입출력, C 스타일 API 연동, 저수준 문자 처리 등 다양한 상황에서 필요한 작업입니다. 이 글에서는 대표적인 세 가지 방법을 코드 예제와 함께 살펴보겠습니다.
방법 1: 반복문으로 한 문자씩 복사
알고리즘
시작
문자열 m에 값을 할당한다.
i = 0부터 sizeof(m)까지 반복하며
char 배열에 문자를 하나씩 복사하고 출력한다.
종료예제 코드
#include<iostream>
#include<string.h>
using namespace std;
int main() {
char m[] = "Tutorialspoint";
string str;
int i;
for(i=0;i<sizeof(m);i++) {
str[i] = m[i];
cout<<str[i];
}
return 0;
}이 방법은 가장 기본적인 접근 방식으로, 인덱스를 이용해 문자열의 각 문자를 순회하면서 직접 복사합니다. 동작 원리를 이해하는 데는 좋지만, 실무에서는 아래 방법들이 더 간결하고 안전합니다.
방법 2: strcpy() 함수 사용
C 표준 라이브러리의 strcpy() 함수를 호출하면 문자열 내용을 char 배열로 간단하게 복사할 수 있습니다. 단, C++의 std::string은 내부적으로 널 종료 문자를 보장하지 않으므로, c_str() 메서드를 사용해야 합니다.
알고리즘
시작 문자열 s에 값을 할당한다. strcpy()를 사용해 문자열의 내용을 char 배열로 복사한다. 종료
예제 코드
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int main() {
string str = "Tutorialspoint";
char c[str.size() + 1];
strcpy(c, str.c_str());
cout << c << '\n';
return 0;
}실행 결과
Tutorialspoint
주목할 점은 배열 크기를 str.size() + 1로 선언했다는 것입니다. 문자열 끝의 널 종료 문자('\0')까지 저장할 공간이 필요하기 때문입니다.
방법 3: std::string::copy() 사용
C 스타일 함수인 strcpy() 대신, C++ 표준 라이브러리가 제공하는 std::string::copy() 멤버 함수를 사용할 수도 있습니다. 이 방식은 C++다운 접근법이며 버퍼 오버플로 위험을 줄일 수 있습니다.
알고리즘
시작 문자열 s에 값을 할당한다. copy()를 사용해 문자열의 내용을 char 배열로 복사한다. 종료
예제 코드
#include <iostream>
#include <string>
using namespace std;
int main() {
string str = "Tutorialspoint";
char c[str.size() + 1];
str.copy(c, str.size() + 1);
c[str.size()] = '\0';
cout << c << '\n';
return 0;
}실행 결과
Tutorialspoint
copy() 함수는 널 종료 문자를 자동으로 추가하지 않으므로, 마지막 위치에 '\0'을 명시적으로 넣어주어야 합니다. 이 부분을 놓치면 배열 출력 시 쓰레기 값이 함께 출력될 수 있으니 주의하세요.
정리
- 반복문 방식: 동작 원리 학습에 유용하지만 코드가 길어집니다.
- strcpy() 방식: 간편하지만 C 스타일 함수이며
c_str()호출이 필요합니다. - copy() 방식: C++ 표준 방식으로 안전성이 높지만 널 종료 문자를 직접 추가해야 합니다.
세 가지 방법 모두 같은 결과를 출력하지만, 상황과 요구 사항에 따라 적절한 방법을 선택하는 것이 좋습니다.