1


当一个空字符串被传递给 find 函数时,它返回 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
找到

我的问题是为什么 find 返回 0 而不是返回 string::npos ?

4

3 回答 3

5

如果我们有所有的,l可以在i干草堆的位置找到一根针。你所处理的只是这个定义的空洞事实:如果没有有效的x开头,'for all x ' 会自动变为 true。hi + len(l) <= len(h)0 <= k < len(l)l[k] == h[i+k]

于 2021-02-02T17:51:27.207 回答
2

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

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

  1. 查找第一个等于 的子字符串str

什么时候在某个位置找到字符串?

形式上,如果以下所有条件都为真,则称在位置 xpos 处找到子字符串 str:

  • xpos >= pos
  • xpos + str.size() <= size()
  • 对于 中的所有职位nstrTraits::eq(at(xpos+n), str.at(n))

空字符串在位置 0 处满足这些要求。

文档进一步说。(重点是我的。)

特别是,这意味着

  • 只有在以下情况下才能找到子字符串pos <= size() - str.size()
  • 一个空子串在pos当且仅当pos <= size()
  • 对于非空子字符串,如果pos >= size(),函数总是返回npos
于 2021-02-02T17:52:21.600 回答
1

它在位置 0(搜索的第一个)处找到了完全匹配,因此返回该索引。

引用cppreference,条件是:

形式上,如果以下所有条件都为真str,则称在位置找到子字符串xpos

  1. xpos >= pos
  2. xpos + str.size() <= size()
  3. 对于 中的所有职位nstrTraits::eq(at(xpos+n), str.at(n))

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

  1. 满足,因为 0(我们的搜索位置)>= 0(开始参数)
  2. 满足,因为 0 + 0 <= size()
  3. 被满足了,因为 needle 中没有一个字符与 haystack 中的对应字符不匹配——它们都匹配。
于 2021-02-02T17:55:47.673 回答