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

C++빌더 Q&A
C++Builder Programming Q&A
[5054] Re:[질문] AnsiString에서..
조재영 [] 2930 읽음    2001-01-31 11:39
nassol 님이 쓰신 글 :
: 아무래도 AnsiString에 대한 이해 부족에서 나오는 질문인거 같은데요..
: 아래는 질문을 위해서 문맥과 상관없이 예를 써본거에요.
:
: TStringList *StringList = new StringList();
: StringList->Add("nassol 22");
: String Name, TempString =  StringList->Strings[0];
: int Age; =0;
:
: Name = String(strtok(TempString.c_str(), " ")); //바로 요 부분에서 걸리는데요,
:
: Age = ...
: delete StringList;
:
: // 바로.. 라고 주석단 부분 있잖아요.
: TempString은 새로 선언된 String Class고 StringList->Strings[0]과 단지 같은
: 문자열을 지닌 StringList->Strings[0]와는 전혀 다른 문자열이라고 생각 했거든요.
: 근데 strtok하고 나면 TempString에는 nassol만 남잖아요. " "까지 잘라서.
: 근데 StringList->Strings[0]까지 nassol만 남더라고요. --;
:
: 뭔가 잘못 알고 있다는 생각이 들어서 질문을 드립니다. 원래 프로그램에서는
: 저 스트링 리스트의 아이템들은 변하면 안되거든요. 그걸 이용해서 데이터를
: 추출해내기만 하고요..
:
: 쩝. 감사합니다.

우선 다음의 부분을 봐주세요.

    TStringList *StringList = new TStringList;
    StringList->Add("nassol 22");
    AnsiString Name, TempString ;
A:    TempString =  StringList->Strings[0];
B:    TempString += "AAAAAAAAA";
    int Age =0;

    Name = String(strtok(TempString.c_str(), " ")); //바로 요 부분에서 걸리는데요,

    //Age = ...
    delete StringList;

우선 AnsiString의 특징을 이해하셔야 합니다.
AnsiString 은 가변적인 사이즈를 지원합니다. 그 말은 데이터가 더 필요하다면
다른 주소공간을 잡아서 그 데이터를 집어 넣는거죠.

그 부분이(즉 실제적으로 string을 기억하는 주소번지) AnsiString 의 Data 부분입니다.
디버깅으로 돌려보시면 A: 문 앞에서 TempString 의 Data가 NULL임을 알 수 있습니다.
그리고 A: 행을 넘어서면 TempString의 Data가 바뀌는데 이 값이 StringList->Strings[0]의
Data와 같음을 알 수 있습니다.
즉, 똑같은 내용을 담는데 굳이 다시 메모리를 확보할 필요가 없기때문일 겁니다.

하지만 B: 의 행을 실행하면 내용이 늘어나 추가적으로 메모리를 확보해야 하므로
TempString 의 Data와 StringList->Strings[0]의 Data의 값이 달라집니다.
즉, 확보하고 있는 주소공간이 달라진다는 거죠.
그런데 strtok 문은 그 해당 되는 내용을 바꿔 버립니다.
따라서 님의 예제에서는 둘다 바뀌어 버린거죠.

strtok는 잘써면 편하지만 항상 주의하셔야 하는 명령문입니다.
strtok는 왠만하면 따로 복사를 해둔곳에서 수행하는 것이 좋습니다.
그리고 AnsiString 에서 Data와 이것을 char*로 형편환하는 c_str() 은
읽기용이 아닌이상 바로 사용하지 않는 것이 좋습니다.
바로 위와같이 strtok문 같이 말이죠..

그럼...

+ -

관련 글 리스트
5051 [질문] AnsiString에서.. nassol 2763 2001/01/31
5054     Re:[질문] AnsiString에서.. 조재영 2930 2001/01/31
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.