2012-02-20 5 views
5

일부 데이터로 채워지는 버퍼 (예 : char buffer[1024])가 있습니다. 이제이 버퍼의 하위 문자열을 검색하려고합니다. 그것은 인시던트 검색이 아니기 때문에 나는 boost::algorithm::ifind_first을 사용하고 있습니다.부스트 find_first 어떻게 작동합니까?/범위 정의

은 그래서 함수를 다음과 같이 호출

boost::iterator_range<char*> buf_iterator; 
buf_iterator = boost::algorithm::ifind_first(buffer ,"substring"); 

이 실제로 잘 작동합니다. 하지만 내 관심사는 다음과 같습니다 :

char pointer을 전달하므로 ifind_first은 내 버퍼가 어디에서 끝나는지 모를 수 있지만 여전히 작동합니다.

이제 첫 번째 아이디어는이 함수가 문자열 종료 문자까지 검색한다는 것입니다.

template<typename Range1T, typename Range2T> 
    iterator_range< typename range_iterator<Range1T>::type > 
    find_first(Range1T & Input, const Range2T & Search); 

그것이 템플릿 매개 변수와 함께 작동하기 때문에 실제로는 널 (null) 종료와 함께 작동하는지 의심 :하지만 Boost Documentation에서 함수는 다음과 같이 정의된다?

그럼 내 질문은 어떻게 ifind_first 어디에서 멈출지를 알고 있습니까? 또는 더 정확하게 말하면 어떻게 범위를 지정할 수 있습니까? 이미 언급했듯이 char*으로 잘 작동하지만, 나는 운이 좋았던 지 아닌지 잘 모르겠습니다. 최악의 경우 함수가 호출되고 정지 할 위치를 알지 못하고 정의되지 않은 메모리로 들어갑니다. .

편집 :

지금 대답에 나는 함수에 전달할 유형에 따라 달라집니다이 언급되었다. 이제 내가 char 버퍼로 작업한다면 항상 0으로 끝나는 지 확인해야합니다 ...?

+0

문서에 메서드가 명시되어 있으면 매우 잘 숨겨져 있습니다. – CapelliC

+0

게시물에 서명하지 마십시오. –

답변

5

그것은 배열의 길이는 템플릿 인수 인 기술, 예를 사용하여 공지의 길이 L은 예 foo를 같이 도출 될 수있다 리터럴 스트링으로

template< typename T, size_t L > 
void foo(T (&arr)[L]) 
{ 
} 

를 ("테스트") 인 foo에 < char, 5>(). const char *에 과부하가 걸려 있는데, 인수가 c-string이고 strlen()을 사용하여 길이를 결정할 수 있다고 가정합니다.

편집 : ifind_first이 실패하는 방법, 그리고 당신이 무엇 ifind_first이 경우가 있는지 하나 될 수 있습니다 또는 검색으로 퇴화에 실패하거나하지 않습니다 여부를 결정

조심있어하지 않을 경우 이유를 더 나은 설명 데모 char *. 이 경우 문자열 리터럴을 직접 검색으로 전달하면 ifind_first가 시도하고 추측하여 const char [10] (NULL 종결 자의 경우 "substring"길이 +1)이라고 결론을 내릴 것입니다. 그러나 검색에 대해서는 상관 없습니다. 왜냐하면 const char *로 변질 되더라도 ifind_first는 NULL로 끝나는 C 문자열이고 문자열 리터럴은 NULL로 끝나는 C 문자열이므로 해당 항목이 멋지게 작동하기 때문입니다.

이 경우 실제로 char 버퍼 [1024]를 요구하고 있습니다. 귀하의 경우에는 char *로 변질되지 않습니다. 하지만 대신 char * buffer = new char [1024]라고 말하면됩니다. 버퍼의 타입은 char *이며 NULL로 끝나는 것이 보장되지는 않는다. 이 경우 ifind_first는 당신이 채운 영역 뒤의 상황에 따라 신비한 방식으로 실패합니다.

결론적으로, 버퍼 유형이 char [1024]이므로 버퍼의 끝을 지나쳐 메모리를 만지지는 않지만, 거기에 NULL 터미네이터가 있는지 여부는 신경 쓰지 않습니다. 그것을 보지 않는다. char [1024]를 넘겨 주면 컴파일 타임에 길이를 알 수있다. 그래서 만약 당신이 12 개의 문자들로 채워진 버퍼를 채운다면, 그것은 여전히 ​​전체 버퍼를 검색 할 것입니다.

+0

이것은 왜'strlen()'이 도움이되지 않는 null이 아닌'char' 버퍼를 사용하고있는 것처럼 보이는지 설명하지 않습니다. – nabulke

+0

즉, 예를 들어 1024 바이트의 버퍼가있는 경우 버퍼를'char buffer [1025] = {0}'으로 초기화해야합니다. 그래서 ** 항상 ** null로 끝났습니다. 정확히 1024 바이트) ...? – Toby

+0

@nabulke : 아니요, char 버퍼 [1024]는 고정 크기입니다. char *가 아닙니다 (주의하지 않으면 char *로 변질 될 수 있지만). 보십시오 buf_iterator = boost :: algorithm :: ifind_first ((char *) buffer, "substring"); – Ylisar

관련 문제