假设我有一个字符串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终结符上,所以我没有任何访问任何内存的危险。
我说错了吗?
答案 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