strstr 函数求字串

博客围绕KMP串的模式匹配展开,要求找到Pattern在String中首次出现位置并输出后续子串,找不到则输出“Not Found”。介绍了不同测试数据特点,还给出输入、输出格式及C语言函数strstr相关内容。

KMP 串的模式匹配 (25分)

给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出。如果找不到,则输出“Not Found”。

本题旨在测试各种不同的匹配算法在各种数据情况下的表现。各组测试数据特点如下:

  • 数据0:小规模字符串,测试基本正确性;
  • 数据1:随机数据,String 长度为 10​5​​,Pattern 长度为 10;
  • 数据2:随机数据,String 长度为 10​5​​,Pattern 长度为 10​2​​;
  • 数据3:随机数据,String 长度为 10​5​​,Pattern 长度为 10​3​​;
  • 数据4:随机数据,String 长度为 10​5​​,Pattern 长度为 10​4​​;
  • 数据5:String 长度为 10​6​​,Pattern 长度为 10​5​​;测试尾字符不匹配的情形;
  • 数据6:String 长度为 10​6​​,Pattern 长度为 10​5​​;测试首字符不匹配的情形。

输入格式:

输入第一行给出 String,为由英文字母组成的、长度不超过 10​6​​ 的字符串。第二行给出一个正整数 N(≤10),为待匹配的模式串的个数。随后 N 行,每行给出一个 Pattern,为由英文字母组成的、长度不超过 10​5​​ 的字符串。每个字符串都非空,以回车结束。

输出格式:

对每个 Pattern,按照题面要求输出匹配结果。

输入样例:

abcabcabcabcacabxy
3
abcabcacab
cabcabcd
abcabcabcabcacabxyz

输出样例:

abcabcacabxy
Not Found
Not Found

C语言函数strstr

#include<iostream>
#include<string.h>
using namespace std;
int main(){
    string s,ss;
    const char*p;
    getline(cin,s);
    int n;
    cin>>n;
    getchar();
    for(int i=0;i<n;i++){
          getline(cin,ss);

    p=strstr(s.c_str(),ss.c_str());
    if(p==NULL)
        cout<<"Not Found"<<endl;
    else
        cout<<p<<endl;
    }

    return 0;
}

 

### C++ 中 `strstr()` 函数的用法及示例 #### 使用方法 `strstr()` 是标准库 `<cstring>` 提供的一个函数,用于在一个字符串中查找另一个子串的位置。如果找到匹配项,则返回指向第一个匹配位置的指针;如果没有找到任何匹配项,则返回空指针 `nullptr`。 其定义如下: ```cpp const char* strstr(const char* str1, const char* str2); ``` - 参数 `str1` 表示要被搜索的目标字符串。 - 参数 `str2` 表示需要查找的子字符串。 - 返回值是一个常量字符指针,指向第一次出现子字符串的地方[^2]。 需要注意的是,该函数区分大小写,因此 `"abc"` 和 `"ABC"` 被视为同的字符串[^2]。 #### 示例代码 下面展示了一个简单的例子来演示如何使用 `strstr()`: ```cpp #include <iostream> #include <cstring> // 包含 strstr() using namespace std; int main() { const char* text = "This is an example of using strstr."; const char* pattern = "example"; // 查找子字符串 'pattern' 是否存在于 'text' const char* result = strstr(text, pattern); if (result != nullptr) { cout << "Substring found at position: " << (result - text) << endl; } else { cout << "Substring not found." << endl; } return 0; } ``` 在这个程序里,通过调用 `strstr(text, pattern)` 来寻找单词 `"example"` 在句子中的首次出现位置。如果成功定位到目标字串,则打印出它的索引偏移量[(result - text)];反之则提示未发现相应片段[^1]。 另外值得注意的一点是,在实际应用过程中还需要考虑边界情况比如当输入为空或者模式串长度超过源串等情况下的处理方式[^4]。 --- ### 自定义实现 `strStr()` 功能 除了直接利用现有的 `strstr()` 外部接口外,也可以尝试自己编写类似的逻辑操作以达到相同效果。这里给出一种基于双层循环遍历比较两段数据序列之间是否存在连续一致部分的方法论描述及其对应伪码表示形式[^5]: ```cpp class Solution { public: int strStr(string haystack, string needle) { if(needle.empty()) return 0; // 如果 needle 是空字符串,按照题目要应该返回 0 for(int i=0;i<haystack.length()-needle.length()+1;i++){ bool matched=true; for(int j=0;j<needle.length();j++) if(haystack[i+j]!=needle[j]){ matched=false; break; } if(matched){ return i; } } return -1;// 若无匹配结果则最终输出 -1 值代表失败情形 } }; ``` 上述自定义版本同样实现了基本的功能需,并且能够应对某些特定场景下可能存在的特殊状况分析与解决策略探讨[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值