c++ 에서 find_first_of, find_last_of 를 사용할 때 유의할 점이 있다.
두 함수가 모양만 봤을 때 처음으로, 마지막으로 사용된 위치를 찾는 기능을 하는 것은
쉽게 알 수 있다.
하지만 함수의 파라메터로 받은 search string의 경우
잘못 생각하면 큰 실수를 범할 수 있다.
최근 message header에서 사용되는 encoded-word를 파싱할 때
실수를 했던 부분이다.
std::string strEncodedSubject = "=?EUC-KR?B?x9Gx2yDA3yC1ybHuPw==?=";
// encoded-word는 =?[character set]?[encoding type]?[encoded string]?= 로 구성된다.
// 앞뒤 "=?", "?=" 위치 파악을 위해..
size_t tIdx = strText.find_first_of("=?");
std::cout << tIdx << std::endl;
tIdx = strText.find_last_of("?=");
std::cout << tIdx << std::endl;
=> 결과는 0, 32 이다.
무엇이 문제인가..
아시는 분들은 "그건 당연히 그렇게 사용하는 거지.." 하겠지만
find_first_of, find_last_of는 파라메터로 받는 search string을
string 전체로 search하는 것이 아니라,
해당 string의 구성하는 char 중 어떤 것이라도 먼저 혹은 마지막에 발견된 위치를
찾는 함수이다.
(차라리.. token 함수와 유사함)
그렇다. 내가 원하는 위치를 찾기 위해서는
find, rfind를 사용하는 것이 맞다.
size_t tIdx = strText.find("=?");
std::cout << tIdx << std::endl;
tIdx = strText.rfind("?=");
std::cout << tIdx << std::endl;
=> 결과는 0, 31 이다.
이렇게 간단한 실수지만 잘못하면 정말 찾기힘든
치명적인 버그를 만들게 된다.
분명 예전에도 한번 실수 해서 조심해야 겠다하고.. 생각한적 있는데..
또 이런 기본적인 실수를..
전자제품이건.. API건 사용 설명서를 꼼꼼히 읽고 사용하도록 하자.
피드 구독하기:
댓글 (Atom)
스프린트 정리
스프린트 : 스프린트는 프로토타입을 제작하고 고객과 함께 아이디어를 테스트하여 중요한 문제들에 대한 답을 찾는 독특한 5일 짜리 과정이다. 스트린트는 업무 전략, 혁신 행동과학, 디자인 그 외 여러 분야의 최고 히트작을 어떤 팀에서라도 사용할 수 있...
-
그전에.. 난 그전 revision파일 찾아가며.. 비교해서 다시 커밋했는데.. 정말.. 미련한 짓이었다.. 아래와 같이 하면.. 된다. svn merge -r [REV_from]:[REV_to] [Source URL] ...
-
Dictionary Harvest Attack.. 사전 수확 공격?? 임의의 글짜, 단어, 사전, 성씨 등을 조합하여 특정 메일 서버에 메일을 보내고, 메일이 성공적으로 전송이 되서 해당 메일 주소가 유효한 것으로 판단하고 수확한다. ...
-
linux에서 cifs, nfs 등 네트워크 공유 경로 등을 마운트 사용할 때, 경우에 따라 마운트를 해제하지 않고 마운트된 디랙터리 내용이 아닌 실제 로컬 경로의 내용 확인이 필요한 경우가 있다. 로컬 경로를 직접 마운트하면 되는데, 마...
댓글 없음:
댓글 쓰기