<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
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("%sn",strstr(s1,s2)); //defgh printf("%sn",strstr(s1,s3)); //(null) return 0; }
BF演演算法,即暴力(Brute Force)演演算法,BF演演算法的思想就是str1的第一個字元與str2的第一個字元進行匹配,若相等,則繼續比較str1的第二個字元和 str2的第二個字元;若不相等,則比較str1的第二個字元和str2的第一個字元,依次比較下去,直到得出最後的匹配結果。
用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演演算法是一種改進的字串匹配演演算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人們稱它為克努特—莫里斯—普拉特操作(簡稱KMP演演算法)。KMP演演算法的核心是利用匹配失敗後的資訊,儘量減少模式串(str2)與主串(str1)的匹配次數以達到快速匹配的目的。具體實現就是通過一個next陣列實現,陣列本身包含了模式串的區域性匹配資訊。
KMP演演算法與BF演演算法的區別是:主串不會回退,模式串每次也不一定回退到第一個位置上。
具體演演算法思想可參考:KMP演演算法講解
#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函數內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45