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] ...
-
c++ 에서 find_first_of, find_last_of 를 사용할 때 유의할 점이 있다. 두 함수가 모양만 봤을 때 처음으로, 마지막으로 사용된 위치를 찾는 기능을 하는 것은 쉽게 알 수 있다. 하지만 함수의 파라메터로 받은 search...
-
CPIO 옵션 i 압축해제하라는 옵션 o 압축 생성 옵션 p 표준입력에서 파일명을 읽는다. B 5120 bytes블럭단위로 입출력한다. c 아스키 형식으로 헤더정보를 읽고 쓴다. d 없는...