2012-02-20 93 views
5

我有一個緩衝區(例如char buffer[1024]),它被填充一些數據。現在我想在這個緩衝區中搜索一個子字符串。由於它應該是一個不區分大小寫的搜索,我正在使用boost::algorithm::ifind_firstBoost find_first它是如何工作的? /定義一個範圍

因此,我調用該函數是這樣的:

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

這其實工作正常。但我的關注如下:

我通過函數只是char pointer,所以ifind_first應該不知道我的緩衝區結束,但它仍然工作壽。

現在我的第一個想法是,該函數搜索,直到字符串終止字符。但在Boost Documentation函數的定義如下:

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

因爲它與模板參數的工作原理其實我懷疑它正在與空終止?

所以我的問題是如何ifind_first知道在哪裏停止?或者更確切地說,我怎麼給它一個範圍?正如已經提到過的,它可以很好地工作,但是我不確定我是不是很幸運 - 我的意思是在最壞的情況下函數被調用,並且不知道停止和進入未定義內存的位置。 。

編輯:

現在在回答中有提到,這取決於我傳遞給函數的類型。現在這意味着如果我使用一個char緩衝區,我必須始終確保它是0終止的......?

+0

如果文檔聲明瞭方法,它會很好地隱藏! – CapelliC 2012-02-20 14:25:55

+0

請不要在你的帖子上簽名。 – 2012-02-20 15:09:30

回答

5

它使用一種技術,其中一個陣列的長度爲模板參數,即:

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

作爲字符串文字具有已知長度L可以推斷,比如foo(「測試」)爲FOO < char,5>()。我敢打賭,const char *有一個重載,它假設參數是一個c字符串,其中strlen()可以用來確定長度。

編輯:更好的解釋示範ifind_first會怎麼失敗的,爲什麼它不會,如果你細心的話

什麼決定ifind_first是否會失敗,或者在此情況下,無論是這兩門科目或搜索退化成一個char *。在這種情況下,您已經直接傳遞了一個字符串文字作爲搜索,ifind_first將嘗試猜測它會得出結論,它是const char [10](NULL結束符的「substring」+ 1的長度)。然而,對於搜索來說並不重要,因爲即使它退化爲const char * ifind_first也會猜測它是一個NULL終止的c字符串,並且字符串literal是一個NULL終止的c字符串,因此它可以用作dandy。

在這種情況下,你確實需要char buffer [1024],在你的情況下它不會退化爲char *。但是如果你想讓char * buffer = new char [1024];緩衝區的類型是char *,並且不能保證以NULL結尾。在這種情況下,ifind_first將以神祕的方式失敗,具體取決於您填寫的區域之後的內容。

因此,總結一下,由於緩衝區類型是char [1024],在你的情況下它不會觸及超過緩衝區末端的內存,但是,它也不會在意是否有NULL終結符沒有找到它,因爲你已經通過了一個char [1024]它知道編譯時的長度)。所以,如果讓我們說你用12個字符填充緩衝區後跟NULL,它仍然會搜索整個緩衝區。

+0

這並不能解釋爲什麼它似乎與非空終止的'char'緩衝區一起工作,其中'strlen()'不起作用。 – nabulke 2012-02-20 14:52:35

+0

所以這意味着例如:如果我有一個1024字節的緩衝區,我應該用'char buffer [1025] = {0}初始化我的緩衝區,所以我確定它總是** null終止(即使當我收到正好1024字節)...? – Toby 2012-02-20 14:53:05

+0

@nabulke:不,char buffer [1024]是固定大小,它不是char *(儘管如果你不小心它可能退化爲char *)。嘗試buf_iterator = boost :: algorithm :: ifind_first((char *)buffer,「substring」); – Ylisar 2012-02-20 16:35:43

相關問題