C++ string中的find()函数

1844 篇文章 ¥399.90 ¥499.90
C++中的string类提供了find()函数,用于查找子串在母串中的位置。该函数返回子串首次出现的下标,未找到则返回npos。它可以查找特定位置后的子串,并通过正反向查找确定子串是否唯一。应用实例包括查找唯一人名的字符串、确定前缀字符串集合以及计算区间内子串出现次数等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.string中find()返回值是字母在母串中的位置(下标记录),如果没有找到,那么会返回一个特别的标记npos。(返回值可以看成是一个int型的数)

#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
    ////find函数返回类型 size_type
    string s("1a2b3c4d5e6f7jkg8h9i1a2b3c4d5e6f7g8ha9i");
    string flag;
    string::size_type position;
    //find 函数 返回jk 在s 中的下标位置
    position = s.find("jk");
    if (position != s.npos)  //如果没找到,返回一个特别的标志c++中用npos表示,我这里npos取值是4294967295,
    {
        printf("position is : %d\n" ,position);
    }
    else
    {
        printf("Not found the flag\n");
    }
}

2.返回子串出现在母串中的首次出现的位置,和最后一次出现的位置。

1  flag = "c";
2      position = s.find_first_of(flag);
3      printf("s.find_first_of(flag) is :%d\n",position);
4      position = s.find_last_of(flag);
5      printf("s.find_last_of(flag) is :%d\n",position);

在这里插入图片描述
3.查找某一给定位置后的子串的位置

1  //从字符串s 下标5开始,查找字符串b ,返回b 在s 中的下标
2     position=s.find("b",5);
3     cout<<"s.find(b,5) is : "<<position<<endl;

在这里插入图片描述
4.查找所有子串在母串中出现的位置

//查找s 中flag 出现的所有位置。
    flag="a";
    position=0;
    int i=1;
    while((position=s.find(flag,position))!=string::npos)
    {
        cout<<"position  "<<i<<" : "<<position<<endl;
        position++;
        i++;
    }

在这里插入图片描述
5.反向查找子串在母串中出现的位置,通常我们可以这样来使用,当正向查找与反向查找得到的位置不相同说明子串不唯一。

1     //反向查找,flag 在s 中最后出现的位置
2     flag="3";
3     position=s.rfind (flag);
4     printf("s.rfind (flag) :%d\n",position);

例题:

1.给出一个字符串,串中会出现有人名,找到一个只有一个人名的字符串。

#include <bits/stdc++.h>
using namespace std;
vector<string> s;
int main()
{
    s.push_back("Danil");
    s.push_back("Olya");
    s.push_back("Slava");
    s.push_back("Ann");
    s.push_back("Nikita");///建立动态数组
    string a;
    cin>>a;
    int res = 0;
    for(int i = 0; i < 5; i++)
    {
        if(a.find(s[i]) != a.npos)
        {
            res++;
            if(a.rfind(s[i]) != a.find(s[i]))///一个字符中出现多个一样的名字
            {
                res++;
            }
        }
    }
    if(res == 1)
    {
        cout<<"YES"<<endl;
    }
    else
    {
        cout<<"NO"<<endl;
    }
    return 0;
}

2.你有n个字符串。 每个字符串由小写英文字母组成。 重新排序给定的字符串,使得对于每个字符串,在它之前的所有字符串都是它的子串。

https://www.cnblogs.com/wkfvawl/p/9229758.html

#include<string>
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
bool cmp(string a, string b)
{
    if (a.length() == b.length())
        return a < b;
    return a.length() < b.length();
}
int main()
{
    int n;
    string s[111];
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        cin >> s[i];
    }
    sort(s, s + n, cmp);
    int flag = 1;
    for (int i = 1; i < n; i++)
    {
        if (s[i].find(s[i-1]) == string::npos)
        {
            flag = 0;
            break;
        }
    }
    if (flag)
    {
        cout << "YES" << endl;
        for (int i = 0; i < n; i++)
        {
            cout << s[i] << endl;
        }
    }
    else
    {
        cout << "NO" << endl;
    }
    return 0;
}

3.查询区间内子串在母串中的个数。

https://www.cnblogs.com/wkfvawl/p/9452869.html

#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int n,m,q,i,j,l,r,len;
    int counts;
    int vis[10010];
    string s1,s2;
    cin>>n>>m>>q;
    cin>>s1>>s2;
    len=s2.size();
    memset(vis,0,sizeof(vis));
    string::size_type pos=0;
    while((pos=s1.find(s2,pos))!=string::npos)
    {
        vis[pos+1]=pos+1;
        pos++;
    }
    for(i=1;i<=q;i++)
    {
        counts=0;
        scanf("%d%d",&l,&r);
        for(j=l;j<=r;j++)
        {
            if(vis[j]!=0&&vis[j]+len-1<=r)
            {
               counts++;
            }
        }
        printf("%d\n",counts);
    }
    return 0;
}
### C++ 中 `string` 类的 `find` 函数使用方法 #### 查找子串并获取其起始位置 当需要在一个字符串中查找特定子串时,可以使用 `find` 方法。此方法返回被查找到的第一个匹配项的位置索引;如果未找到,则返回 `string::npos`。 ```cpp #include <iostream> #include <string> int main() { std::string str = "Hello World"; std::string target = "World"; std::string::size_type pos = str.find(target); if (pos != std::string::npos) { std::cout << "Found at position: " << pos << '\n'; } else { std::cout << "Not Found\n"; } return 0; } ``` 这段代码展示了如何通过调用 `str.find(target)` 来定位目标子串 `"World"` 在源字符串 `"Hello World"` 中首次出现的位置[^1]。 #### 设置查找起点 可以通过指定第二个参数来设定从哪个位置开始执行搜索操作。这允许程序跳过某些部分而只关注感兴趣的区域。 ```cpp std::string text = "programming is fun and games are also fun"; std::string word = "fun"; // 从第8个字符之后开始寻找单词 'fun' std::string::size_type index = text.find(word, 8); if(index != std::string::npos){ std::cout << "'fun' found after position 8 at : " << index << "\n"; } else{ std::cout << "'fun' not found after position 8.\n"; } ``` 这里说明了如何利用额外的参数控制查找范围,从而提高效率或实现更复杂的逻辑需求[^4]。 #### 处理找不到的情况 对于未能成功匹配的情形,应该始终检查返回的结果是否等于 `string::npos`,这是标准库定义的一个常量,用来指示不存在有效结果的状态。 ```cpp #include <iostream> #include <string> using namespace std; int main(){ string s1="Hello World Hello World"; size_t find_pos=s1.find("abc"); if(find_pos==string::npos){ // 注意这里是 == 而不是 = cout<<"找不到"; } else{ cout<<find_pos; } return 0; } ``` 上述例子修正了一个常见的错误——将赋值运算符 `=` 错误地用于条件判断语句中,并正确处理了无法找到模式串的情景[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值