C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[10] 팁! 안시스트링의 c_str() 함수
박지훈.임프 [cbuilder] 16705 읽음    1999-06-04 00:00
임프랍니다..
하루도 빼지않고 아침마다 빌라 여러분께 배달해드리는.. 임프의... 오늘의 팁~~!!
오늘은.. 안시스트링의 멤버함수중 char *형으로 리턴해주는 c_str()함수에
대해 알아봅시다.. 역시 비파툴에 답변했던 내용이구요..
안시스트링의 선언에 대해 좀더 구체적으로 아시고 싶으신 분은, 아래에도
언급했지만, source/vcl 디렉토리에 있는 dstring.cpp를 참고하시면 됩니다.
(안시스트링은 빌더의 vcl에서 유일한 c++코드죠.)
그럼, 도움되시길 바라면서, 이만...



제  목:[질문]String->char* 변환에서...
보낸이:김지형  (Soulfire)    11/02 02:46  조회:11  1/2
──────────────────────────────────────
TEdit->Text의 내용을 문자배열에 옮기기 위해 다음과 같이 할 때...

char* Temp;

Temp = Edit1->Text.c_str();

이상하게도 처음부터 다섯글자까지만 옮겨지고 나머진 잘려나갑니다.
(처음부터 네번째 글자까지는 제대로, 다섯번째 글자는 이상한  코드로 바뀜)
그래서 디버깅을 해보니 F7을 누르며 모든단계를 하나씩 다 살펴보며
진행할 때는 제대로 옮겨지는데...이때는 나중에 계속 실행하다 보면
Access Biolation Error(기억이 잘...다른 에러일수도 있음.)가 나는군요.
아무래도 Memory쪽에 뭔가 문제가 있는것 같다는 생각이 드는데...
정확히 어디가 문제인지 잘 모르겠습니다.

알고계신 분께서는 부디 답변좀 해 주시길...
당연히 이상 없을줄 알았던 부분이 이렇게 속을 썩이다니...--;;;
그럼...즐거운 통신 되시길...

PS:그리고 도움말을 읽어보니 c_str()함수를 사용하면 새로운 문자배
열이 만들어져 그 포인터가 리턴되게 되는 것 같던데...나중에
delete[] 써서 수동으로 그 문자 배열 지워주어야 하나요?
이문제에 대해서도 답변해 주시면 감사하겠습니다.




제  목:[답변] String->char* 변환에서..
보낸이:박지훈  (cbuilder)    11/02 03:20  조회:28  1/3
──────────────────────────────────────
임펠리테리입니다.
안시스트링에 대해서 잘못 아시고 계시는것 같습니다.
AnsiString의 멤버함수 c_str()은 메모리를 할당하여 문자열을 복사해주지
않습니다. 단순히 포인터만 넘겨주죠.

AnsiString 클래스의 정의가 있는 dstring.h를 보시면 확실히 아실 수 있을
겁니다. 이 클래스를 보면, 안시스트링의 데이터는 char *형의 포인터입니다.
그리고 c_str()함수의 선언을 보면 간단하게 다음과 같이 정의를 한꺼번에
해줬습니다.

   char* __fastcall c_str() const
   {return (Data)? Data: "";}

다시 말해서, c_str()함수는 내부 데이터인 char * 형인 Data의 포인터만 넘겨
준겁니다. 그러므로 c_str() 함수가 리턴한 값을 계속 보관하면서 사용할 수
없습니다. 원본 안시스트링 객체내에서 내부 데이터의 메모리를 해제하고 다시
할당했을 경우를 가정하면 리턴받은 포인터는 엉뚱한 위치를 가지고 있을것이므로
당연히 억세스바이얼레이션이 생깁니다. 그리고 원본 안시스트링 객체가 내부적
으로 메모리를 할당/해제했는지에 대해 어떠한 가정도 할수 없습니다.

말씀하신 코드는 다음과 같이 수정되어야 하겠네요.

#include <string.h>
...
char *Temp = new char[Edit1->Text.Length+1];
strcpy(Temp, Edit1->Text.c_str());
...
delete[] Temp;
...


그럼, 도움되시길 바라면서, 이만...



독립문에서 임펠리테리였습니다.




+ -

관련 글 리스트
10 팁! 안시스트링의 c_str() 함수 박지훈.임프 16705 1999/06/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.