|
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문 같이 말이죠..
그럼...
|