2017년 11월 28일 화요일

find_first_of, find_last_of 함수 오용 주의

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건 사용 설명서를 꼼꼼히 읽고 사용하도록 하자.

스프린트 정리

스프린트 :  스프린트는 프로토타입을 제작하고 고객과 함께 아이디어를 테스트하여 중요한 문제들에 대한 답을 찾는 독특한 5일 짜리 과정이다. 스트린트는 업무 전략, 혁신 행동과학, 디자인 그 외 여러 분야의 최고 히트작을 어떤 팀에서라도 사용할 수 있...