最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言模擬實(shí)現(xiàn)strstr函數(shù)的示例代碼

 更新時(shí)間:2022年07月13日 16:34:29   作者:Liquor999  
strstr是C語言中的函數(shù),作用是返回字符串中首次出現(xiàn)子串的地址。本文將用C語言模擬實(shí)現(xiàn)strstr函數(shù),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

strstr函數(shù)介紹

C語言提供了字符串匹配函數(shù) strstr 函數(shù),請看文檔簡介。

這個(gè)函數(shù)是用來匹配 str2 是否包含在 str1 字符串中,如果匹配成功,則返回指向str1中第一個(gè)出現(xiàn)的str2的指針,如果str2不是str1的一部分,則返回空指針。
我們不妨舉例說明,請看下面代碼,調(diào)用 strstr 函數(shù)需要引入string.h頭文件,我們發(fā)現(xiàn),s1字符串中可以找到s2字符串,那么就返回s1中s2的第一個(gè)字符的地址,s1字符串并沒有s3,所以返回空指針。

#include<stdio.h>
#include<string.h>

int main(){

    char* s1 = "abcdefgh";
    char* s2 = "def";
    char* s3 = "dee";
    
    printf("%s\n",strstr(s1,s2)); //defgh   
    printf("%s\n",strstr(s1,s3)); //(null)

    return 0;
}

BF算法介紹

BF算法,即暴力(Brute Force)算法,BF算法的思想就是str1的第一個(gè)字符與str2的第一個(gè)字符進(jìn)行匹配,若相等,則繼續(xù)比較str1的第二個(gè)字符和 str2的第二個(gè)字符;若不相等,則比較str1的第二個(gè)字符和str2的第一個(gè)字符,依次比較下去,直到得出最后的匹配結(jié)果。

BF算法模擬實(shí)現(xiàn)strstr函數(shù)

用BF算法實(shí)現(xiàn) strstr 函數(shù)的思路就是遍歷整個(gè) str1,在內(nèi)層循環(huán)進(jìn)行判斷,如果str1 和 str2 對應(yīng)的字符相等且比較的字符在 str2 長度范圍之內(nèi), 那么就比較下一位,當(dāng)這次循環(huán)結(jié)束,此時(shí)只有兩種情況,第一種是比較的字符等于 str2 的長度,那么就代表找到了,返回 str2 在 str1 第一個(gè)字符地址即可,至于為什么是 str1 + i - j,請朋友們思考一下就明白了。第二種情況是某個(gè)字符之間不匹配,那么 str1 下次匹配的位置為前一個(gè)字符位置 + 1,str2 又回到第一個(gè)字符開始匹配。直到整個(gè) str1 超出了匹配的范圍,代表找不到整個(gè)字符串 str2,故返回NULL。

char* my_strstr(char* str1, char* str2){
    assert(str1 && str2);
    
    int slen = strlen(str1);
    int sublen = strlen(str2);
    
    int i = 0;
    int j = 0;
    int count = 0;

    while(i < slen){
        
        while(str1[i] == str2[j] &&  j < sublen){
            ++i;
            ++j;
        }

        if(j >= sublen){
            return str1 + i - j;
        }
        
        ++count;
        i = count;
        j = 0;
        
    }        

    return NULL;

}

KMP算法介紹

KMP算法是一種改進(jìn)的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人們稱它為克努特—莫里斯—普拉特操作(簡稱KMP算法)。KMP算法的核心是利用匹配失敗后的信息,盡量減少模式串(str2)與主串(str1)的匹配次數(shù)以達(dá)到快速匹配的目的。具體實(shí)現(xiàn)就是通過一個(gè)next數(shù)組實(shí)現(xiàn),數(shù)組本身包含了模式串的局部匹配信息。

KMP算法與BF算法的區(qū)別是:主串不會回退,模式串每次也不一定回退到第一個(gè)位置上。

具體算法思想可參考:KMP算法講解

KMP算法模擬實(shí)現(xiàn)strstr函數(shù)

#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>

void get_next(int* next, char* sub){
    int len = strlen(sub);
    next[0] = -1;
    next[1] = 0;

    int i = 2;
    int k = 0;

    while(i < len){
        if(k == -1 || sub[i-1] == sub[k]){
            next[i] = ++k;
            ++i;
        }else{
            k = next[k];
        }
    }
    
    
    
}

char* my_strstr(char *str1, char * str2){
    assert(str1 && str2);
    
    int slen = strlen(str1);
    int sublen = strlen(str2);

    int* next = (int*)malloc(sizeof(int)*sublen);
    assert(next);
    get_next(next,str2);

    int i = 0;
    int j = 0;

    while(i < slen && j < sublen){
        if(j == -1 || str1[i] == str2[j]){
            ++i;
            ++j;
        }else{
            j = next[j];
        }
    }

    if(i >= sublen){
        return str1 + i - j;
    }else{
        return NULL;
    }
    
}

到此這篇關(guān)于C語言模擬實(shí)現(xiàn)strstr函數(shù)的示例代碼的文章就介紹到這了,更多相關(guān)C語言 strstr函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言取模取整的深入理解

    C語言取模取整的深入理解

    本文主要介紹了?C語言取模取整的深入理解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Linux系統(tǒng)下C語言gets函數(shù)出現(xiàn)警告問題的解決方法

    Linux系統(tǒng)下C語言gets函數(shù)出現(xiàn)警告問題的解決方法

    這篇文章主要給大家介紹了關(guān)于在Linux系統(tǒng)下C語言gets函數(shù)出現(xiàn)警告問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • QT串口通信的實(shí)現(xiàn)方法

    QT串口通信的實(shí)現(xiàn)方法

    如果用qt寫程序作為上位機(jī),然后通過和usb和下位機(jī)通信的時(shí)候,就需要用到qt中的串口通信了。本文介紹了QT串口通信的實(shí)現(xiàn)方法,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C/C++: Inline function, calloc 對比 malloc

    C/C++: Inline function, calloc 對比 malloc

    以下是對c/c++中的malloc函數(shù)與calloc函數(shù)的區(qū)別以及它們之間的聯(lián)系進(jìn)行了介紹,需要的朋友可以過來參考下
    2016-07-07
  • C語言實(shí)現(xiàn)交換排序算法(冒泡,快速排序)的示例代碼

    C語言實(shí)現(xiàn)交換排序算法(冒泡,快速排序)的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C語言實(shí)現(xiàn)交換排序算法(冒泡排序、快速排序),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-07-07
  • C語言中大小端問題實(shí)例探索解決方法

    C語言中大小端問題實(shí)例探索解決方法

    這篇文章主要介紹了C語言中大小端問題實(shí)例,總的來說這并不是一道難題,那為什么要拿出這道題介紹?拿出這道題真正想要傳達(dá)的是解題的思路,以及不斷優(yōu)化探尋最優(yōu)解的過程。希望通過這道題能給你帶來一種解題優(yōu)化的思路
    2023-02-02
  • C語言中操作密碼文件的一些函數(shù)總結(jié)

    C語言中操作密碼文件的一些函數(shù)總結(jié)

    這篇文章主要介紹了C語言中操作密碼文件的一些函數(shù)總結(jié),包括setpwent()函數(shù)和getpwent()函數(shù)以及endpwent()函數(shù),需要的朋友可以參考下
    2015-08-08
  • C語言如何求整數(shù)的位數(shù)及各位數(shù)字之和

    C語言如何求整數(shù)的位數(shù)及各位數(shù)字之和

    這篇文章主要介紹了C語言如何求整數(shù)的位數(shù)及各位數(shù)字之和,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 在vs2010中,輸出當(dāng)前文件路徑與源文件當(dāng)前行號的解決方法

    在vs2010中,輸出當(dāng)前文件路徑與源文件當(dāng)前行號的解決方法

    本篇文章是對在vs2010中,輸出當(dāng)前文件路徑與源文件當(dāng)前行號的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言中指針常量和常量指針的區(qū)別

    C語言中指針常量和常量指針的區(qū)別

    本文主要介紹了C語言中指針常量和常量指針的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評論

隆昌县| 岑巩县| 个旧市| 锦屏县| 广州市| 开原市| 阿克苏市| 伊宁县| 嘉义县| 玛沁县| 怀集县| 锦州市| 沅陵县| 西青区| 贵港市| 紫阳县| 顺昌县| 南充市| 库尔勒市| 台前县| 临夏县| 铁岭县| 辽阳市| 乐清市| 张家界市| 简阳市| 清新县| 鹤壁市| 开平市| 云梦县| 北安市| 阳城县| 黄陵县| 阿勒泰市| 时尚| 河曲县| 大姚县| 商河县| 青州市| 新沂市| 拉萨市|