std :: string :: find_first_of的界限

时间:2015-11-24 13:21:36

标签: c++

假设我有一个字符串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将出现在null终结符上,所以我没有任何访问任何内存的危险。

我说错了吗?

3 个答案:

答案 0 :(得分:4)

如果第一个点位于字符串的末尾,则它位于索引size() - 1处。

然后是start + 1 == size(),这意味着find_first_of会在区间[size(), size())中查找。这是一个空间隔,因此根本不会进行任何内存访问。

答案 1 :(得分:0)

此时可能没有空终止符。 (标准不保证:如果需要,需要c_str()添加一个)。

但是你的代码在任何情况下都没问题。将指针设置为指向1-past-an-array的行为是明确定义的,因此允许使用start + 1调用函数start是字符串中的最后一个字符。在内部,该指针的取消引用将不会发生在find_first_of将搜索的区域之外。

答案 2 :(得分: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