中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言模擬實現strstr函數的代碼怎么寫

發布時間:2022-07-14 09:30:55 來源:億速云 閱讀:148 作者:iii 欄目:開發技術

這篇文章主要介紹了C語言模擬實現strstr函數的代碼怎么寫的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C語言模擬實現strstr函數的代碼怎么寫文章都會有所收獲,下面我們一起來看看吧。

strstr函數介紹

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

C語言模擬實現strstr函數的代碼怎么寫

這個函數是用來匹配 str2 是否包含在 str1 字符串中,如果匹配成功,則返回指向str1中第一個出現的str2的指針,如果str2不是str1的一部分,則返回空指針。
我們不妨舉例說明,請看下面代碼,調用 strstr 函數需要引入string.h頭文件,我們發現,s1字符串中可以找到s2字符串,那么就返回s1中s2的第一個字符的地址,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的第一個字符與str2的第一個字符進行匹配,若相等,則繼續比較str1的第二個字符和 str2的第二個字符;若不相等,則比較str1的第二個字符和str2的第一個字符,依次比較下去,直到得出最后的匹配結果。

BF算法模擬實現strstr函數

用BF算法實現 strstr 函數的思路就是遍歷整個 str1,在內層循環進行判斷,如果str1 和 str2 對應的字符相等且比較的字符在 str2 長度范圍之內, 那么就比較下一位,當這次循環結束,此時只有兩種情況,第一種是比較的字符等于 str2 的長度,那么就代表找到了,返回 str2 在 str1 第一個字符地址即可,至于為什么是 str1 + i - j,請朋友們思考一下就明白了。第二種情況是某個字符之間不匹配,那么 str1 下次匹配的位置為前一個字符位置 + 1,str2 又回到第一個字符開始匹配。直到整個 str1 超出了匹配的范圍,代表找不到整個字符串 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算法是一種改進的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人們稱它為克努特&mdash;莫里斯&mdash;普拉特操作(簡稱KMP算法)。KMP算法的核心是利用匹配失敗后的信息,盡量減少模式串(str2)與主串(str1)的匹配次數以達到快速匹配的目的。具體實現就是通過一個next數組實現,數組本身包含了模式串的局部匹配信息。

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

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

KMP算法模擬實現strstr函數

#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;
    }
    
}

關于“C語言模擬實現strstr函數的代碼怎么寫”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“C語言模擬實現strstr函數的代碼怎么寫”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

黔南| 商丘市| 三江| 甘肃省| 沾益县| 德令哈市| 嘉鱼县| 宜兰市| 湘潭市| 娄烦县| 桐庐县| 甘洛县| 黔南| 朔州市| 无棣县| 渝中区| 微博| 德惠市| 清水河县| 调兵山市| 南汇区| 井陉县| 皋兰县| 巴中市| 桑植县| 漳平市| 安平县| 宝鸡市| 泰安市| 锦州市| 黄平县| 松阳县| 洛川县| 赤壁市| 汉沽区| 汨罗市| 淳化县| 萝北县| 临高县| 无极县| 罗城|