当传递一个空字符串给查找函数时,它返回0。
如果传递的是未初始化的字符串,那么它也返回0。
#include <iostream>
#include <string>
using namespace std;
int main() {
string str1="";
string str2="This is a sample string";
unsigned int loc = str2.find(str1);
cout << "Loc : " << loc << endl;
if(loc != string::npos)
{
cout << "Found" << endl;
}
else
{
cout << "Not found" << endl;
}
return 0;
}
:
Loc: 0
发现我的问题是为什么找到返回0而不是返回字符串::npos ?
如果i + len(l) <= len(h)
,则在干草堆h
的i
位置可以找到针l
,对于所有0 <= k < len(l)
,我们有l[k] == h[i+k]
。你所处理的只是这个定义的空洞真理:如果没有有效的x开始,'for allx'自动变为真。
正如cppreference上的文档所说。(重点是我的)
查找第一个等于给定字符序列的子字符串。查找从pos开始,即查找到的子字符串不能从pos之前的位置开始。
- 查找第一个等于
str
的子字符串
何时在某个位置找到字符串?
形式上,如果满足以下所有条件,则子字符串str在位置xpos处被找到:
xpos >= pos
xpos + str.size() <= size()
- 适用于
str
,Traits::eq(at(xpos+n), str.at(n))
中的所有位置n
位置0处的空字符串满足这些要求。
文档进一步说明。(重点是我的)
特别地,这意味着
- 子字符串只能在
中找到pos <= size() - str.size()
- 在
pos
找到空子字符串当且仅当pos <= size()
- 对于非空子字符串,如果
pos >= size()
,函数总是返回npos
。
它在位置0(第一个搜索的位置)找到了精确匹配,因此返回index。
引用cppreference,条件是:形式上,如果满足以下所有条件,子字符串
str
被称为在位置xpos
上找到:
xpos >= pos
xpos + str.size() <= size()
- 适用于
str
,Traits::eq(at(xpos+n), str.at(n))
中的所有位置n
尝试从位置0匹配子字符串,我们得到
- 满足,因为0(我们的搜索位置)>= 0(开始参数) 满足
- ,因为0 + 0 <= size() 满足
- ,因为针中没有字符不匹配干草堆中的相应字符-它们都匹配。