一、函數功能
strstr函數是C語言提供的字符串處理函數之一,其作用是檢索在一個字符串中是否包含另一個子字符串,並返回該子字符串在主字符串中的地址。
二、函數原型
char *strstr(const char *str1, const char *str2);
其中,str1為主字符串,str2為子字符串,函數返回值為指向第一次出現子串的指針。
三、函數實現
1. 暴力匹配算法
暴力匹配算法又被稱為樸素匹配算法,採用逐個比較主字符串和子字符串中的字符的方法,若匹配成功則返回主字符串當前位置指針。
char* my_strstr(const char* str1, const char* str2)
{
while(*str1)
{
const char* p1 = str1;
const char* p2 = str2;
while(*p1 && *p2 && !(*p1 - *p2))
{
p1++;
p2++;
}
if(!*p2)
{
return (char*)str1;
}
str1++;
}
return NULL;
}
2. KMP算法
KMP算法利用字符串的前綴和後綴的公共部分,避免了暴力算法中大量的回溯操作,從而提高匹配效率。
void getNext(char *T,int *next){
int i=1,j=0;
next[1]=0;
while(i<strlen(T)){
if(j==0||T[i-1]==T[j-1]){
++i;
++j;
next[i]=j;
}
else{
j=next[j];
}
}
}
char *KMP(char *S,char *T,int pos,int *next){
int i,j;
i=pos;j=1;
while(i<=strlen(S)&&jstrlen(T)){
return S+pos;
}
else{
return NULL;
}
}
3.Boyer-Moore算法
Boyer-Moore算法是一種啟發式算法,它根據模式串最後一個字符在主串中出現的位置,計算出向右移動的步數,從而實現快速匹配。
#define max(x,y) (x>y?x:y)
void pre_bmBc(char *x,int m,int bmBc[]){
int i;
for(i=0;i<256;i++){
bmBc[i]=m;
}
for(i=0;i=0;i--){
j=i;
while(j>=0&&x[j]==x[m-1-i+j]){
--j;
}
suffix[i]=i-j;
}
}
void pre_bmGs(char *x,int m,int bmGs[]){
int i,j,suffix[max_length];
pre_suffix(x,m,suffix);
for(i=0;i=-1;i--){
if(i==-1||suffix[i]==i+1){
for(;j<m-1-i;++j){
if(bmGs[j]==m){
bmGs[j]=m-1-i;
}
}
}
}
for(i=0;i<=m-2;i++){
bmGs[m-1-suffix[i]]=m-1-i;
}
}
char *BoyerMoore(char *s,char *x){
int i,j;
int m=strlen(x);
int n=strlen(s);
int bmBc[256],bmGs[max_length];
pre_bmBc(x,m,bmBc);
pre_bmGs(x,m,bmGs);
j=0;
while(j=0&&x[i]==s[i+j];--i){
;
}
if(i<0){
return s+j;
j+=bmGs[0];
}
else{
j+=max(bmGs[i],bmBc[s[i+j]]-m+i+1);
}
}
return NULL;
}
四、函數應用
strstr函數常用於字符串查找操作,如字符串替換、字符串匹配、文本搜索等相關應用。
#include
#include
int main() {
char str[80] = "this is a test string";
char *ptr;
ptr = strstr(str, "test");// 查找子字符串
if(ptr) {
printf("test is found at position %ld\n", ptr-str);// 返回字符串中的位置
} else {
printf("test not found\n");
}
return 0;
}
五、總結
本文詳細介紹了C語言中的strstr函數及其實現算法,包括暴力匹配算法、KMP算法和Boyer-Moore算法,並給出了相應代碼實現。此外,文章還對該函數的應用場景進行了簡單介紹。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/185011.html
微信掃一掃
支付寶掃一掃