std::string::find_first_of的边界

3
假设我有一个字符串foo,我想查找第二个句点(如果有的话)。
我使用的代码如下:
 std::size_t start = foo.find_first_of('.');
 if (start != std::string::npos){
     std::size_t next = foo.find_first_of('.', start + 1);
     /*and so on*/

我想知道当第一个句点在字符串末尾时,这是否被定义良好。

我认为是的,因为start + 1将位于空终止符上,所以我不会冒险访问任何我不应该访问的内存。

我的理解正确吗?

3个回答

4
如果第一个点在字符串末尾,它的索引为size() - 1
因此,start + 1 == size(),意味着find_first_of将查找区间[size(), size())。这是一个空区间,因此不会进行任何内存访问。

0

在那一点上可能没有空终止符。(标准不保证它:如果需要,c_str()将添加一个)。

但是你的代码无论如何都可以正常运行。将指针设置为指向数组1之后的位置的行为是明确定义的,因此如果start是您字符串中的最后一个字符,则使用start + 1调用函数是允许的。内部来说,当您在find_first_of将搜索的区域之外时,该指针的解引用将不会发生。


0

C++标准对第二个参数的值没有任何限制。

该函数试图按以下方式计算实际位置xpos

pos <= xpos and xpos < size()

如果无法找到这样的值,它会返回std::string::npos
例如:
std::string s( "AB" );

auto pos = s.find_first_of( "A", std::string::npos );
if ( pos == std::string::npos ) std::cout << "Not found" << std::endl;

输出结果为

Not found

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接