C++에서 String class는 C에서의 char_를 손쉽게 조작할 수 있도록 도와주는 STL이다.
다음은 자주 쓰이는 String class의 멤버함수들이다.
함수 명 | 기능 |
---|---|
length |
문자열의 길이를 리턴한다. |
clear |
empty 문자열로 초기화한다. |
empty |
empty 문자열인지 확인하여 true/false를 리턴한다. |
c_str |
C string 형식으로 반환한다. |
조금 더 많은 정보를 원한다면 다음의 링크를 통해 상세한 내용을 살펴보기 바란다. | |
위의 설명에서와 같이 c_str은 String class에서 담고있는 문자열을 C에서의 const char* 타입으로 변환하여 반환해주는 편리한 멤버함수이다. | |
하지만 이 함수를 이용함에 있어 한 가지 주의를 기울여야 한다. | |
다음의 코드를 통해 이를 살펴보자. |
#include <string>
using namespace std;
void printString(const char* str)
{
cout << str << endl;
}
string makeString()
{
return string("Temporary Object");
}
int main(void)
{
string str_loc("Local variable");
cout << str.c_str() << endl;
const char* char_loc = str_loc.c_str();
cout << char_loc << endl;
str_loc = string("Local variable changed");
cout << char_loc << endl;
cout << makeString().c_str() << endl;
const char* char_temp = makeString().c_str();
cout << char_temp << endl;
cout << "Test Done" << endl;
}
위의 코드를 실행시켜 보면 결과는 다음과 같다.
Local variable
Local variable
Temporary Object
Test Done
이는 아마 모든 문자열들이 정상적으로 출력되리라는 독자들의 예상과는 사뭇 다른 결과일 것이다. 이러한 결과가 나타난 이유는 다음과 같다.
String class의 멤버함수인 c_str()은 원본 객체가 담고있는 문자열에 대해 const char* 타입을 리턴한다. 하지만 이 값은 원본 객체인 **string이 메모리를 재할당**받거나 **string 객체가 사라지는 순간** 무효화 된다. 이러한 이유로 위에서 3번째(`Local variable changed`)와 5번째(`Temporary Object`) 출력문이 정상적으로 출력되지 않은 것이다.
따라서 우리는 c_str()
을 사용할 때 원본 객체의 값이 변하진 않았는지, 원본 객체가 사라지지 않았는지에 유의하여 사용해야할 것이다. 만약 이러한 고려를 하고싶지 않다면 strdup()
를 쓰는 것도 한 가지 방법일 것이다.
'개발언어 > C++' 카테고리의 다른 글
문자열 리터럴: char* vs char [] (0) | 2020.08.25 |
---|---|
switch-case 문에서의 local variable 선언 (0) | 2020.08.08 |
decltype(auto) vs auto (0) | 2020.08.04 |