string의 c_str 함수는 제가 string을 C style의 문자열로 바꿀 때 많이 썼던 함수입니다. 이 메서드는 const char *를 리턴합니다. 내용이 변경되면 안 되는 제약 조건을 가진, char형 포인터를 리턴합니다. 일단, string의 구조에 대해서 간략하게 설명을 하고, c_str()에 대한 설명을 하도록 하겠습니다.

 


 Stri uffer, StringBuilder, C++의 String 등이 있습니다. C++의 스트링 클래스에는 capacity와 size가 있는데요. 이는 동적 배열이 있는 Class는 보통 이 두 메서드를 구현을 많이 하는 편입니다. append 100만번 하면 시간이 오래 걸리는지 안 걸리는지 체크만 해도 되고요.

 

 

 실제로 내부 구조를 보면, string 클래스 안에 char형 배열이 들어 있어요. wrapped 되었다고 이야기 합니다. 이 배열은 특이하게도, 크기가 고정되어 있지 않는데요. 동적으로 변할 수 있어요. 즉, Dynamic array 라는 건데요. 뒤에 'c'를 append 해 봅시다.

 

 

 그러면 문자열의 길이가 5가 됩니다. 그 다음에 'a'를 뒤에 append를 해 볼 건데요. capacity가 5인 경우, 뒤에 붙이지 못해요. 그렇기 때문에, expand를 해야 하는데요. 보통, 2배로 키우게 됩니다.

 

 

 그러면 요래 늘어날 거에요. 여기서 중요한 것은, Dynamic array도 있지만, String 객체 안에, 실 데이터인 char형 배열이 들어 있다는 거에요. 이것은 외부에서 변경이 되면 안 되기 때문에, c_str 함수가 리턴을 할 때, const char *를 리턴하는 것입니다.

 

 


 다음 프로그램을 봅시다.

 

 

 프로그램이 꽤 길어 보이는데요. 10번째 줄까지만 봅시다. pch는 문자열의 시작 주솟값을 리턴해 줍니다. 그리고, char형 포인터 tar에, pch의 값을 대입하였습니다. 여기까지 상황을 그림으로 그려보면 아래와 같아요.

 

 

 지금 pch와 tar가 가리키고 있는 공간이 같아요. 그 다음에, tar[3]의 값을 'b'로 바꿉니다.

 

 

 그러면, 아래와 같이 변경이 될 거에요. 11번째 줄에서, 저는 string s의 문자열의 시작 주소를 가지고 옵니다. 이 시작주소에서부터, NULL 문자를 만날 때 까지, 그대로 문자 배열 str에 복사를 하는데요. 만약에, string s에 있는, 내부 버퍼 str의 시작 주소가 pch와 같다면, "abcb"가 복사가 될 거에요.

 

 

 이런 상황이기 때문이에요. 만약에 내부 버퍼랑 pch가 별개의 공간에 있다면, "abcd"가 복사될 거에요.

 

 

 왜냐하면, pch가 가리키는 공간하고, str이 가리키는 배열하고 다르기 때문입니다. 실행 결과는 어떻게 나왔을까요?

 

 

 "abcb"가 복사되었는데요. 이는, c_str이 string의 내부 버퍼의 시작 주소를 돌려주었다는 소리입니다.

 


  c_str이, string의 내부 버퍼의 시작 주소를 돌려주기 때문에, c_str()을 쓰고 난 뒤에, strcpy를 통해서, string copy를 해야 합니다. 물론, 문자열의 내용만 출력한다고 하면 copy 할 필요가 없습니다.

 

 원형을 보시면, 매개변수가 아무것도 없습니다. 단지, string에 있는 내부 문자열의 시작 주소를 가져오기 위해서 쓸 뿐입니다. 예제 프로그램을 보겠습니다.

 

 

 먼저, s에는 "abcde"라는 내용이 들어가 있습니다. s 내부에 있는 버퍼에는 "abcde"가 들어가 있습니다. 9번째 줄을 보면, s.c_str(); 부분이 있는데요. 이는 s의 내부 버퍼의 시작 주소를 리턴합니다. 그 값이 pch가 됩니다. 그러면, pch는 "abcde"의 시작 주솟값을 가리킬 겁니다.

 

 

 이런 상황인가요? 여기서, strcpy의 2번째 인자에 pch를 넘기고, 1번째 인자에 str을 넘겨 봅시다. 그러면 pch가 가리키는 배열하고, 전역 변수의 배열 str은 별개의 space에 있습니다.

 

 

 따라서, string s의 내부 배열을 건드리지 않고도, 안전하게 변형을 할 수 있습니다. 당연하게도 str을 출력하면 "abcde"가 나옵니다.