기본 콘텐츠로 건너뛰기

라벨이 STL인 게시물 표시

문자열 다루기

카페 > 프로그래머들의 세계 | 필더 http://cafe.naver.com/programmers/649 문자열 다루기 STL의 string을 사용 #include <TCHAR.h> #include <string> namespace std { typedef basic_string<TCHAR> tstring; } To be continued... static 함수 및 버퍼 사용 /** * Maps a character string to a wide-character (Unicode) string. * @param[in] lpsz ASCII string * @return UNICODE string */ static WCHAR* ToWChar(LPCSTR* lpsz) { static WCHAR wszBuffer[1024]; _wcsset(wszBuffer, 0); int nWStrLen = /* the number of wide characters written to the buffer */ MultiByteToWideChar( CP_ACP, /* CodePage: ANSI code page */ 0, /* dwFlags: character-type options */ lpsz, /* lpMultiByteStr: string to map */ -1, /* cbMultiByte: number of bytes in string */ wszBuffer, /* lpWideCharStr: wide-character buffer */ 1024); /* cchWideChar: size of...

[STL] erase()를 사용하여 List 원소 삭제 시 주의사항

picbuddy님의 블로그 (Mesh Generation) | 플라나 http://blog.naver.com/picbuddy/80032246219 다시 한번 기억을 환기시키기 위해 /////////////////////////////////////////////////////// for( Iterator = Vector.begin(); Iterator != Vector.end(); ) { Vector.erase(Iterator); } /////////////////////////////////////////////////////// for( Iterator = List.begin(); Iterator != List.end(); ) { List.erase(Iterator); } 위 두 문장의 차이가 뭘까? 위의 문장에서는 문제가 없지만 아래 문장에서는 에러가 발생한다. 왜 그럴까? erase 함수의 구현은 둘다 똑같은데... 그 이유는.... RandomAccessIterator와 BidirectionalIterator의 차이에 있습니다. vector는 해당 원소가 삭제되면 Iterator의 공백을 삭제된 원소 다음에 있는 원소 위치로 채워지게 된다. 이는 RandomAccessIterator(멋대로 접근 가능 지시자)라 가능한 듯...(솔직히 컴파일러에 따라 다른지 그것까지는 모르겠음. 일단 Visual Studio에서는 그렇게 작동) 허나 list는 BidirectionalIterator(순서대로 차근차근 접근 가능)이므로 해당 원소가 삭제되면 Iterator는 그 다음 위치를 잃어버리게 되는 것이다. 결국 그 다음 지시자의 위치는 까마득한 별나라로... 이를 위한 해결 방법 가장 확실한 방법은 erase 함수의 리턴값을 이용하는 것이다. erase 함수의 리턴값이 바로 삭제 원소 다음에 있는 원소 iterator이기 때문... for( Ite...

std string을 이용한 uppercase

어리버리 | 돌이 http://blog.naver.com/alexnet/40019562468 stl을 쓰다보니, 간단하게 upcase, locase를 쓰길를 희망하는데, 마땅한게 없다...--;; 이걸 응용해서 다른 것들도 만들어서 쓰면 될 것 같다. std::string upcase(const std::string& s) { std::string s2(s); for(unsigned int ii = 0; ii < s2.length(); ii++) s2[ii] = toupper(s2[ii]); return s2; } // Allows multiple filters separated by ';' bool testCall(string file, string _filter) { std::string strOrgName(upcase(pszOrgName)); std::string strCompare(upcase(g_filelist[i])); if(strCompare.find(strOrgName) != std::string::npos) { ::OutputDebugString("발견"); } } 이것 보다 간단한 방법이 하나 있다고 해서 사용한 적이 있는데, 눈으로 봤을때는 strlwr()을 사용하는 점이 다를 뿐, 이상이 없는 것 처럼 보였다... 한참 지나고 나서 알게 된 사실은 이건 stl에서 권장하는 방법이 아니었다... 왜냐하면, strlwr은 C/C++ 표준함수도 아닐뿐더러... 원본데이터를 손상시키는 Inplace 변환 방법이기 때문이다. (참고: http://kin.naver.com/db/detail.php?d1id=1&dir_id=10104&eid=SrteUU3y93FnHnKrnI5NjX7FhSvZO33P  ) std::s...

문자열(스트링) 전격 분석 2부 2강(끝

울트라매니아! | 울트라맨 http://blog.naver.com/alshrl999/20020402126 백택 ( bektekk@yahoo.co.kr ) 홈페이지 : http://bektekk.wo.to 문자열(스트링) 전격 분석 2부 2강(끝) 이제 실제 클래스들을 다룹니다. 사실 원문에는 VARIANT타입과 VC7 CLR 환경에서의 스트링에 관련된 부분까지 포함하고 있으나, 제가 CLR에 대해서는 문외한인 관계로 생략했고, VARIANT부분은 특별히 의미가 있어 보이지 않아 생략했음을 알려드립니다. 본 강좌는 코드 프로젝트에 제가 좋아하는 프로그래머인 Michael Dunn의 강좌 The Complete Guide to C++ Strings, Part I 과 II 를 번역한 글입니다. 최대한 의역을 하려고 노력했지만, 이런쪽의 경험이 부족하다 보니 많이 모자란 강좌가 되겠지만, 많은 도움이 되셨으면 합니다. 기타 문의 사항이나 질문은 쪽지나 메일을 이용해 주셨으면 합니다. 본강좌는 제 홈페이지(위의 링크)를 통해서도 보실수 있습니다. 스트링 랩퍼 클래스들 지금까지 여러가지의 스트링 타입에 대해 설명했고, 이제 스트링 랩퍼 클래스들에 대해 설명하겠다. 각각 어떻게 생성을 하고 어떻게 C스타일 스트링으로 변환시킬수 있는지 설명하겠다. 왜냐하면 C스타일 스트링 포인터는 API함수를 호출하거나 다른 랩퍼클래스들을 생성하는데 필요하기 때문이다. 나는 그외의 함수들 예를 들자면 정렬, 비교 등의 기능들에 대해서는 생략하도록 하겠다. 다시한번 강조하지만, 확실하지 않다면 절대로 강제 형변환을 하지 않도록 하자. CRT에서 제공하는 클래스들 _bstr_t _bstr_t 클래스는 아주 잘 만들진 BSTR 랩퍼 클래스다. 그리고 BSTR의 내부구현이나 기타 등등의 문제를 랩핑 했다. 이 클래스는 여러가지 연산자를 재정의 했을 뿐만 아니라, 사용자의 편의...