通過一段時間對字符串的了解,我發(fā)現(xiàn)了許多有意思的字符串函數(shù),下面我們就以常見的字符串查找函數(shù):strchr,strrchr,strstr,strrstr為例來模擬實現(xiàn)這些有意思的字符串查找函數(shù)吧!
【strchr】【strrchr】
查找一個字符,有所不同的是:strchr用于查找這個字符第一次出現(xiàn)的位置,strrchr用于查找這個字符最后一次出現(xiàn)的位置.下面我們就來打開MSDN來查找這兩個字符查找函數(shù)的函數(shù)原型:
char *strchr(const char *string,int c)
char *strrchr(const char *string,int c)
需要注意的是:這兩個函數(shù)的第二個參數(shù)是一個整型值,但是它卻包含了一個字符值,因為字符在計算機內(nèi)存中都是存儲的是它的ASC||值,當(dāng)定義為整形時反而提高了它的存儲范圍。
下面我們先給出程序的測試代碼:
對于strchr我們知道它是一個查找一個字符第一次出現(xiàn)的函數(shù),找到后返回一個指向該位置的指針,下面我們就來實現(xiàn)一個查找字符的函數(shù):strchr.
char *my_strchr(char *str,char ch)
下面我們就來驗證這個函數(shù):
我們發(fā)現(xiàn)對于字符串“feabadc”,a這個字符出現(xiàn)了兩次,那仫如果我們用strchr來查找字符a返回的是第一個a和他之后的字符,但是如果我們用strrchr來查找這個字符串呢?又會出現(xiàn)什仫結(jié)果?下面我們就來實現(xiàn)這個函數(shù):strrchr
#define _CRT_SECURE_NO_WARNINGS char *my_strrchr(char *str,char ch)
那仫這個函數(shù)的結(jié)果又是什仫呢?請繼續(xù)向下看
看對于同一個字符串"feabadc",我們使用不同的查找函數(shù)查找其中的字符‘a(chǎn)’我們得到了不一樣的結(jié)果??吹竭@里我們是不是對strchr和strrchr有了更加深入的了解呢?那是肯定的啦!如果我們查找的是一個子串呢?下面我們就來看另一組字符串查找函數(shù):strstr,strrstr.
【strstr】【strrstr】
在字符串中查找子串,我們可以使用strstr,它的函數(shù)原型為:
char *strstr(const char *s1,const char *s2)
和上面類似,strstr雖然是用來查找子串的但是它是在s1中查找第一次出現(xiàn)s2的起始位置,并返回一個指向該位置的指針,下面我們就來實現(xiàn)這個函數(shù)strstr.
char *my_strstr(char *dest,char *src) while((*str1 != '\0') && (*str2 != '\0') && (*str1 == *str2)) char arr1[]="i love you forever"; ret=my_strrstr(arr1,arr2);
它的結(jié)果如下:
對于字符串"i love you forever"它里面存在兩個子串"ve",而我們使用strstr函數(shù)之后返回的是第一個"ve"出現(xiàn)的指針位置,類似上述strchr和strrchr是不是也存在一個strrstr函數(shù)可以查找第二次出現(xiàn)'ve'的位置呢?但是打開MSDN后庫里卻沒有這個函數(shù),是不是這個函數(shù)我們就不能使用呢?下面我們就來實現(xiàn)這個查找第二次出現(xiàn)子串的函數(shù)。
方法一:自定義實現(xiàn)strrstr // i love you fore ver ve char *my_strrstr(char *dest,char *src) first=str1; //記錄下一次比較的起始位置 while((*str1 != '\0') && (*str2 != '\0') && (*str1 == *str2)) second=first; //從第一次查找到子串的位置后繼續(xù)查找 char arr1[]="i love you forever"; ret=my_strrstr(arr1,arr2);
方法二:通過調(diào)用strstr來實現(xiàn)strrstr,測試函數(shù)同方法一
char *my_strrstr(const char *dest,const char *src) while(ret=my_strstr(dest,src))
那仫這個特殊的函數(shù)strrstr它的結(jié)果是不是我們預(yù)想的呢?當(dāng)然啦!下面我們就來運行一下它:
我們發(fā)現(xiàn)確實和我們開始預(yù)想的一樣,神奇的strrstr果然沒有辜負(fù)我們的厚望,通過模擬實現(xiàn)一些字符串的庫函數(shù),可以讓我們更好的了解字符串庫函數(shù)的實現(xiàn),當(dāng)然字符串還有許多功能強大的庫函數(shù)有待大家自己用MSDN了解和使用,以上就是我個人對字符串查找?guī)旌瘮?shù)的一些理解,比較粗糙希望大家多多理解啦!
|