c++中的 String find函数如果作为参数传递的字符串为空,则返回0




当传递一个空字符串给查找函数时,它返回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),则在干草堆hi位置可以找到针l,对于所有0 <= k < len(l),我们有l[k] == h[i+k]。你所处理的只是这个定义的空洞真理:如果没有有效的x开始,'for allx'自动变为真。

正如cppreference上的文档所说。(重点是我的)

查找第一个等于给定字符序列的子字符串。查找从pos开始,即查找到的子字符串不能从pos之前的位置开始。

  1. 查找第一个等于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上找到:

  1. xpos >= pos
  2. xpos + str.size() <= size()
  3. 适用于str,Traits::eq(at(xpos+n), str.at(n))中的所有位置n

尝试从位置0匹配子字符串,我们得到

  1. 满足,因为0(我们的搜索位置)>= 0(开始参数)
  2. 满足
  3. ,因为0 + 0 <= size()
  4. 满足
  5. ,因为针中没有字符不匹配干草堆中的相应字符-它们都匹配。

最新更新