更新時間:2017-11-14 來源:黑馬程序員 瀏覽量:
之前介紹了經(jīng)常用到的9個字符串C標(biāo)準(zhǔn)庫函數(shù),這次我們來介紹一下strstr字符串函數(shù)的實現(xiàn)。
函數(shù)原型:
char * strstr ( const char * str1, const char * str2 );
參數(shù):
str1:需要從其中查找子串的字符串
str2:所要查找的子串
返回:
如果從str1中查找到了str2,則返回str1中第一次出現(xiàn)str2的位置,否則返回NULL.
下面我們來測試一下strstr函數(shù)的功能:
//測試程序
#include
#include //strstr
int main()
{
char str[] = "itcastithemia";
char substr[] = "th";//所要查找的子串
char *p = strstr(str, substr);
if (p != NULL)
printf("%s\n", p);
else
printf("not found %s\n", substr);
p = strstr(str, "tha");
if (p != NULL)
printf("%s\n", p);
else
printf("not found %s\n", substr);
return 0;
}
根據(jù)我們上面對strstr功能的介紹,第一次查找子串”th”,會查找成功,所以strstr函數(shù)會返回th首次出現(xiàn)的地址,而第二次要查找的子串“tha”并沒i用,所以strstr函數(shù)會返回NULL.
測試結(jié)果如圖:
符合我們的預(yù)期。
下面自己實現(xiàn)一個strstr函數(shù),思路如下:
1) 從str1的每一個位置開始,依次和str2中的每一個字符進(jìn)行比較,如果在到str2字符串結(jié)尾之前,出現(xiàn)了不等的情況,則結(jié)果本輪比較,繼續(xù)進(jìn)行下一輪比較,否則查找子串str2成成,返回str1中本輪開始對比的位置。
程序如下:
char *mystrstr(const char *str1, const char *str2)
{
const char *pstr = str1;
const char *psub = str2;
const char *pcur = NULL;
if (str1 == NULL || str2 == NULL) //判斷參數(shù)是否合法
{
return NULL;
}
while (*pstr != '\0')
{
pcur = pstr; //記錄每一次從str1中對比字符的起始位置
psub = str2;
while (*psub != '\0') //從pcur所標(biāo)示的位置開始依次與psub中的每一個字符進(jìn)行比較
{
if (*pcur != *psub) //如果出現(xiàn)字符不相等,則結(jié)束本次循環(huán)指針移動到下一個位置
break;
pcur++;
psub++;
}
if (*psub == '\0') //如果到達(dá)子串結(jié)尾,則說明查找子串成功
return pstr;
pstr++; //pstr指向str1中的下一個字符串位置
}
return NULL;
}
使用自實現(xiàn)的mystrstr運行上面的測試程序,結(jié)果如下:友情提示:獲得更多學(xué)科學(xué)習(xí)視頻+資料+源碼,請加QQ:3276250747。
至此,我們成功自實現(xiàn)了一個strstr函數(shù)。
本文版權(quán)歸黑馬程序員C/C++學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:黑馬程序員C/C++培訓(xùn)學(xué)院
首發(fā):http://c.itheima.com/
C++培訓(xùn)之想要成為軟件開發(fā)中的王者,需要明白的 21 條準(zhǔn)則
2017-08-15c/c++培訓(xùn)C++拷貝構(gòu)造函數(shù)(深拷貝,淺拷貝)
2017-07-22C/c++培訓(xùn)之Linux系統(tǒng)動態(tài)庫加載過程分析
2017-07-02C/c++培訓(xùn)QSignalMapper的使用
2017-07-02C/c++培訓(xùn)之MFC-修改窗口的光標(biāo) 圖標(biāo) 背景
2017-07-02Android+物聯(lián)網(wǎng)培訓(xùn)實戰(zhàn)教程之Android下service詳解
2017-05-31