C语言字符串函数(3)strstr,strtok函数的详解
? ? ? ? 上一期,我講解了關于字符串函數中,受限制的字符串函數,有想了解的小伙伴們可以點此鏈接去看看:C語言字符串函數(2)受限制的字符串函數
? ? ? ? 那么今天,我來講一講標題中這兩個函數的作用和使用方法。
目錄
一.strstr函數
????????1.函數基本原理:
2.接下來,我來展示函數在代碼中的使用方法:
3.模擬實現strstr函數
二.strtok字符串切割函數?
1.定義:
2.函數標準規定:
3.函數代碼使用?
一.strstr函數
注:Find a substring.意為:在字符串中尋找子字符串
????????1.函數基本原理:
????????strstr函數?用于判斷字符串strCharSet是否是string的子串。如果是,則該函數返回strCharSet在string中首次出現的地址;否則,返回NULL。
? ? ? ? const char* string:被查找目標字符串
? ? ? ? const char* strCharSet:要查找的對象字符串
2.接下來,我來展示函數在代碼中的使用方法:
int main() {char a1[] = "www.httpschinasystem.com";char a2[] = "china"; char* tmp=strstr(a1, a2);if (tmp == NULL) {printf("此字符串不存在,未能查找成功!\n");}else {printf("%s\n", tmp);}return 0;}? ? ? ? 通過創建兩個字符串,a1為被查找的字符串,a2為要進行查找的字符串,使用strstr函數,將數據傳給指針進行打印。
????????注:只要子串存在,函數不僅打印出子串a2的內容,還會打印出子串a2在a1所處位置往后的所有字符 。
? ? ? ? 以上代碼呈現的是函數一次就能在a1中找到a2的情況,屬于簡單情況;
? ? ? ? 接下來,我會為大家展現函數需要多次才能在a1中找到a2的復雜情況:
char a3[] = "abbbcdef";char a4[] = "bbc";char* ret = strstr(a3, a4);if (ret == NULL) {printf("此字符串不存在,未能查找成功!\n");}else {printf("%s\n", ret);//bbcdef}? ? ? ?strstr函數對于復雜情況處理過程:
????????通過代碼可知,a4的字符串為:"bbc",a3的字符串為:"abbbcdef",當函數首先利用指針string指向a3的首字符時,發現字符a不等于strCharSet指針指向a4字符串的字符b,string會指向下一個字符進行尋找,string指向了字符b,發現與strCharSet指向的吻合,然后兩個指針同時進行對比,對比成功繼續向后對比,在string和strCharSet第三次進行對比時,發現不相等,尋找失敗。
????????strCharSet指針重新指向a4的首地址,等待string再一次與它指向字符相等;而string會指向剛才字符b的下一個字符,重新開始尋找配對字符,發現配對成功,string與strCharSet再一次開始對比,經過三次的對比都成功,查找成功,查找成功的理由就是strCharSet指針順利指向'\0'字符,系統會把該子串a4在a3的首位置及以后的所有字符作為返回值傳給ret,結束函數執行操作。
以下為查找失敗代碼:
char a5[] = "abbbcdef";char a6[] = "bbd";char* ecp = strstr(a5, a6);//NULLif (ecp == NULL) {printf("此字符串不存在,未能查找成功!\n");}else {printf("%s\n", ecp);}? ? ? ? 表明指向字符串的兩指針從始至終都沒有真正完整的配對成功過,直到指針string遍歷完a5數組中的字符串,然后指向’\0'結束查找,以失敗告終。 函數的返回值置為NULL!
3.模擬實現strstr函數
char* my_Strstr(const char* str1, const char* str2) {assert(str1 && str2);const char* s1 = str1;const char* s2 = str2;char* p = str1;while (*p != '\0') {s1 = p;s2 = str2;while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2) {s1++;s2++;}if (*s2 == '\0')return p;p++;}return NULL; }? ? ? ? 模擬實現的原理與我剛在講解多次尋找情況中所說的一樣,需要考慮三種情況:????????
????????當兩指針開始只要有任何一方,或者雙方都指向'\0'(NULL)空字符時,直接會停止尋找,查找失敗,返回NULL。
? ? ? ? 第二種是被查找的字符串中,string遍歷完所有字符都沒能找到與之相等的子字符串,則查找失敗,返回NULL.
? ? ? ? 最后一種:直到strCharSet指針順利指向子字符串的'\0'位置,才會被判斷為查找成功,該函數返回strCharSet在string中首次出現的地址。
二.strtok字符串切割函數?
????????Find the next token in a string.:?在字符串中查找下一個標記。
1.定義:
????????函數是將字符串strToken通過分割符分解為多組組字符串。
char*strToken:是一長串字符串
char* strDelimit:字符串中的分隔符,字符分割符能夠自己設定,可以是任何符號、記號,也可以是字符 。
2.函數標準規定:
- ????????strtok函數找到str中的下一個標記,并將其用 \0 結尾,返回一個指向這個標記的指針。(注:strtok函數會改變被操作的字符串,所以在使用strtok函數切分的字符串一般都是臨時拷貝的內容,并且可修改。)
- ????????strtok函數的第一個參數不為 NULL ,函數將找到str中第一個標記,strtok函數將保存它在字符串中的位置。
- ????????strtok函數的第一個參數為 NULL ,函數將在同一個字符串中被保存的位置開始,查找下一個標記。!!!
- ????????如果字符串中不存在更多的標記,則返回 NULL 指針。
3.函數代碼使用?
int main() {char arr[] = "www.http://zhangsan@chnk.com";//字符串char arr2[] = { ". : // @" };//分隔符數組char* ret=strtok(arr, arr2);printf("%s\n", ret);ret = strtok(NULL, arr2);printf("%s\n", ret); ret = strtok(NULL, arr2);printf("%s\n", ret); ret = strtok(NULL, arr2);printf("%s\n", ret); ret = strtok(NULL, arr2);printf("%s\n", ret);? ? ? ? 如上圖:arr是要被分割的字符串數組,arr2是分割符數組,函數會通過分隔符的位置將字符串切割成多個字符串。每次切割時遇到分割符就結束切割,每一次切割完等到下一次切割開始都會在上一個保存的位置開始向后操作,直到最后指針遇到;'\0'字符完成切割操作。
????????
????????我將該函數調用5次后才將切割后的所有字符串?全部打印出來,除了第一次調用函數是將arr1放進去,剩下的四次都是放入NULL,原因就是下面規定所要求:
? ? 問題1:大家可能會問若是多打印了一次或者多次,會發生什么?結果如下:?
? ? ? ? 多打印后的結果也是輸出兩次null空字符串,并不會對程序造成越界訪問,報錯。?
問題2:若是字符串有很長很長很長,到底要打印幾遍?造成代碼冗余怎么辦?
? ? ? ? 這是關鍵所在,程序員在設計的時候已經想到了這種情況,針對此,需要我們使用for循環遍歷:
nt main() {char arr[] = "www.http://zhangsanli@bite.com//efhba.cabjke:sqf@1578621";//字符串char arr2[] = { ". : // @" };//分隔符數組//若字符串數組是很長的話,無法算出到底應該輸出幾次才能輸完,所以要用到for循環char* ret = NULL;for (ret = strtok(arr, arr2); ret != NULL; ret = strtok(NULL, arr2)) {printf("%s\n", ret);}return 0; }????????在循環中,ret!=NULL是限制條件,若是下一次拷貝到的是空字符串,就表明字符串已經到了最后了,停止循環。
? ? ? ?初始條件就是第一次得到strtok的返回字符串,每次循環完之后,便會執行下一次的strtok。
好了,對于strstr字符串查找子串函數、strtok字符串切割函數的講解就到這里,大家覺得有用的話,記得點個一鍵三連!?
??
總結
以上是生活随笔為你收集整理的C语言字符串函数(3)strstr,strtok函数的详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编程绘画 安卓编程软件 废旧安卓变废为
- 下一篇: 上海初中计算机课程大纲,《上海市普通中小