2012-02-20 8 views
5

私はいくつかのデータでいっぱいになるバッファ(例えばchar buffer[1024])を持っています。今私は、このバッファ内の部分文字列を検索したいと思います。それは大文字と小文字を区別しない検索でなければならないので、私はboost::algorithm::ifind_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); 

:しかしBoost Documentationに関数が次のように定義されていますか?

私の質問は、ifind_firstはどこで停止するのですか? より正確に言えば、どのように範囲を与えることができますか?すでに言及したように、それはちょうどchar*でうまく動作しますが、私はちょうど幸運ではなかったかどうかはわかりません - 私は最悪の場合、関数が呼び出され、どこで停止して未定義のメモリに入るのかわかりません。 。

編集:

は今の答えに、それは私が関数に渡すタイプに依存していることが挙げられました。今これは私がcharバッファを使って作業する場合、私はいつもそれが0で終了していることを確認しなければならないということを意味します...?

+0

ドキュメントの場合は、非常によく隠されています! – CapelliC

+0

あなたの投稿に署名しないでください。 –

答えて

5

それが配列の長さ、すなわち、テンプレート引数である技術使用:そのようなFOO(「試験」)がFOOであるとして、長さLを推定することができる知っている文字列リテラルとして

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

を< char、5>()。 strlen()が長さを決定するために使用できるc-stringであると仮定しているconst char *のオーバーロードがあります。

EDIT:ifind_firstは失敗しますどのようにより良い説明、デモンストレーション、およびそれはあなたが注意しているない場合、なぜifind_first、この場合には失敗したりしませんかどうかを決定何

が対象または検索のいずれかのに退化するかどうかでありますa char *。この例では、文字列リテラルを直接検索に渡しました。ifind_firstは、const char [10](NULL終端文字の場合は "substring"の長さ)であると判断します。しかし、それは問題ではありません。const char *に縮退したとしても、ifind_firstはNULLで終了するC文字列であり、文字列リテラルはNULLで終わるC文字列であると推測します。

この場合、実際にcharバッファ[1024]を要求しています。あなたのケースではchar *に縮退しません。しかし、代わりにあなたはchar * buffer = new char [1024]と言うことができました。バッファのタイプはchar *であり、NULLで終了することは保証されていません。この場合、if_firstはあなたが満たした領域の後ろにあるものに応じて神秘的な方法で失敗します。

あなたのケースでは、バッファのタイプがchar [1024]であるため、バッファの最後を過ぎてもメモリには触れませんが、そこにNULLターミネータがあるかどうかは気にしませんあなたがそれを渡したので、それを探しません[1024]それはコンパイル時の長さを知っています)。だから、もしあなたが12文字でバッファを埋めると、それはまだ全体のバッファを検索するNULLと言うと言う。

+0

これはなぜ 'strlen()'が助けにならないnullで終わらない 'char'バッファで動作しているように見えるのか説明していません。 – nabulke

+0

これは例を示しています:1024バイトのバッファを持っている場合、私のバッファを 'char buffer [1025] = {0}'で初期化する必要があります。正確に1024バイト)...? – Toby

+0

@nabulke:いいえ、char buffer [1024]は固定サイズですが、char *ではありません(ただし注意しないとchar *に縮退する可能性があります)。しようbuf_iterator =ブースト::アルゴリズム:: ifind_first((char *)バッファ、 "部分文字列"); – Ylisar

関連する問題