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
[74666] Re:Re:Re:wcstok 문의 드립니다.
빌더(TWx) [builder] 3506 읽음    2017-11-17 22:43
강우정 님이 쓰신 글 :
: 빌더(TWx) 님이 쓰신 글 :
: : 강우정 님이 쓰신 글 :
: : : 안녕하세요.
: : :
: : : wchar_t *str = L"View.exe,1,0,&View" 라는 문자열을 wcstok로 자르려고 합니다.
: : :
: : : wcstok(str, L",");
: : : wcstok(NULL, L",");
: : : wcstok(NULL, L",");
: : : ...
: : :
: : : 진행했을 때 예상되는 결과는
: : : View.exe
: : : 1
: : : 0
: : : &View
: : : 인데요. 결과는 이상하게 나옵니다.
: : :
: : : View.exe
: : : 1,0,&Vi
: : : w
: : : 이런식으로요
: : :
: : : 추적을 해보니
: : : str이 View.exe\01,0,&Vi\0w 이런식으로 뒤쪽 영문자 e 가 \0으로 변해서 짤렸더라구요.
: : : 혹시 왜 이렇게 변하는지 도움이 요청드립니다.
: : :
: : :
: :
: :
: : 답변:
: :
: : void __fastcall TForm1::Button1Click(TObject *Sender)
: : {
: :     wchar_t wstr[] = L"View.exe,1,0,&View";
: :     wchar_t *tk = wcstok(wstr, L",");
: :
: :     while (tk != NULL)
: :     {
: :         Memo1->Lines->Add(tk);
: :         tk = wcstok(NULL, L",");
: :     }
: :
: : }
: :
: : RAD 10.2 인데요. 다른 버전에선 안되나요?
: :
:
: 답변 감사합니다.
: 저도 같은 버전이구요. 위에 소스로는 문제가 없이 실행이 되네요.
:
: 저의 다른 점을 찾아봤더니,
: 중간에 첫번째 자른 문자열을 복사하는 과정이 있습니다.
: 이 부분을 주석처리 하고 하니 잘되네요.
:
: wcscpy(tk1, tk);
:
: 이런식으로 복사를 하고 다시 자르려고 하면 wstr 문자열이 제가 말씀드린 것처럼 잘립니다.
: L"View.exe\01,0,&Vi\0w\0"
:
: 중간에 문자열 복사를 하면 이런 현상이 있을 수 있나요?
:
:
:


답변:


wcstok() 함수는 첫번째 호출에서 입력된 wstr에서 토큰이 발견되면
토큰에 해당되는 부분에 '\0' 값을 넣고,
null을 인자로 해서 이어지는 스캔과정에서는 첫번째 호출에서 입력된 wstr을
내부적으로 사용하면서 토큰이 찾아지면 wstr의 해당 위치에 '\0'값을 write 하도록 구현되어 있는데...

복사코드를 어떤 식으로 작성했는지 모르겠지만
wstr을 잘못 건드리지 않는 이상 복사를 한다고 해서 그런 현상이 발생하진 않아요.
코드 어딘가에 잘못 작성되어 있는 부분이 있겠죠.

    wchar_t wstr[] = L"View.exe,1,0,&View";
    wchar_t *tk = wcstok(wstr, L",");
    wchar_t dest[1024];

    while (tk)
    {
        wcscpy(dest, tk);
        printf(" %ws\n", dest);

        tk = wcstok(NULL, L",");
    }


+ -

관련 글 리스트
74660 wcstok 문의 드립니다. 강우정 3438 2017/11/16
74661     Re:wcstok 문의 드립니다. 빌더(TWx) 3467 2017/11/16
74664         Re:Re:wcstok 문의 드립니다. 강우정 3557 2017/11/17
74666             Re:Re:Re:wcstok 문의 드립니다. 빌더(TWx) 3506 2017/11/17
74667                 Re:Re:Re:Re:wcstok 문의 드립니다. 강우정 3398 2017/11/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.