Tob*_*oby 5 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");
Run Code Online (Sandbox Code Playgroud)
这实际上很好.但我关注的是:
我传递函数只是一个char pointer,所以ifind_first应该不知道我的缓冲区在哪里结束,但它仍然可以工作.
现在我的第一个想法是函数搜索直到字符串终止字符.但是在Boost文档中,函数定义如下:
template<typename Range1T, typename Range2T>
iterator_range< typename range_iterator< Range1T >::type >
find_first(Range1T & Input, const Range2T & Search);
Run Code Online (Sandbox Code Playgroud)
由于它适用于模板参数,我实际上怀疑它是否使用null终止?
所以我的问题是如何ifind_first知道在哪里停止?或者更准确地说,我该如何给它一个范围?正如已经提到的那样它可以正常工作char*但是我不太确定我是不是很幸运 - 我的意思是在最坏的情况下调用该函数并且不知道在哪里停止并进入未定义的内存...
编辑:
现在在答案中提到它取决于我传递给函数的类型.现在这意味着如果我使用char缓冲区,我必须始终确保它是0终止的......?
它使用一种技术,其中数组的长度是模板参数,即:
template< typename T, size_t L >
void foo( T (&arr)[L] )
{
}
Run Code Online (Sandbox Code Playgroud)
由于字符串文字已知长度L可以推导出来,例如foo("test")是foo <char,5>().我打赌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,它仍然会搜索整个缓冲区.
| 归档时间: |
|
| 查看次数: |
2621 次 |
| 最近记录: |