提升find_first如何运作? /定义范围

时间:2012-02-20 13:50:55

标签: c++ arrays string boost char

我有一个填充了一些数据的缓冲区(例如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应该不知道我的缓冲区在哪里结束,但它仍然适用。

现在我的第一个想法是函数搜索直到字符串终止字符。但是在Boost Documentation中,函数的定义如下:

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

由于它适用于模板参数,我实际上怀疑它是否正在使用null终止?

所以我的问题是ifind_first如何知道在哪里停止? 或者更准确地说,我该如何给它一个范围?正如已经提到的那样它与char*一样好用,但我不太确定我是不是很幸运 - 我的意思是在最坏的情况下调用该函数并且不知道在哪里停止并进入未定义的记忆...

修改

现在在回答中提到它取决于我传递给函数的类型。现在这意味着如果我使用char缓冲区,我必须始终确保它被终止...?

1 个答案:

答案 0 :(得分:5)

它使用一种技术,其中数组的长度是模板参数,即:

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

由于字符串文字已知长度L可以推导出来,例如foo(“test”)是foo&lt; char,5&gt;()。我打赌const char *有一个重载,假设参数是一个c-string,其中strlen()可以用来确定长度。

编辑:更好的解释说明ifind_first将如何失败,以及为什么在你小心的情况下不会失败

在这种情况下,ifind_first是否会失败的原因是主题或搜索是否退化为char *。在这种情况下,您直接传递了一个字符串文字作为搜索,ifind_first将尝试并猜测它将结束它是const char [10](长度为“substring”+ 1为NULL终止符)。但是,对于搜索它并不重要,因为即使它退化为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个字符后跟NULL,它仍会搜索整个缓冲区。