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
[74667] Re:Re:Re:Re:wcstok 문의 드립니다.
강우정 [ballkiss] 796 읽음    2017-11-20 09:08
빌더(TWx) 님이 쓰신 글 :
: 강우정 님이 쓰신 글 :
: : 빌더(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",");
:     }
:
:

답변 감사합니다.

dest 변수를 wchar_t *dest = L""; 이런식으로 선언했더니 문제가 생겼었습니다.
알려주신데로 wchar_t dest[1024] 로 선언하니 이상이 없네요.

감사합니다.

+ -

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