教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

黑馬程序員C/C++培訓(xùn)專家:常用的9個(gè)字符串C標(biāo)準(zhǔn)庫函數(shù)之strstr實(shí)現(xiàn)

更新時(shí)間:2017年11月21日14時(shí)36分 來源:傳智播客 瀏覽次數(shù):

之前介紹了經(jīng)常用到的9個(gè)字符串C標(biāo)準(zhǔn)庫函數(shù),這次我們來介紹一下strstr字符串函數(shù)的實(shí)現(xiàn)。

函數(shù)原型:

char * strstr ( const char * str1, const char * str2 );

參數(shù):

str1:需要從其中查找子串的字符串

str2:所要查找的子串

返回:

如果從str1中查找到了str2,則返回str1中第一次出現(xiàn)str2的位置,否則返回NULL.

下面我們來測(cè)試一下strstr函數(shù)的功能:

//測(cè)試程序

#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ù)我們上面對(duì)strstr功能的介紹,第一次查找子串”th”,會(huì)查找成功,所以strstr函數(shù)會(huì)返回th首次出現(xiàn)的地址,而第二次要查找的子串“tha”并沒i用,所以strstr函數(shù)會(huì)返回NULL.

測(cè)試結(jié)果如圖:

符合我們的預(yù)期。

下面自己實(shí)現(xiàn)一個(gè)strstr函數(shù),思路如下:

1) 從str1的每一個(gè)位置開始,依次和str2中的每一個(gè)字符進(jìn)行比較,如果在到str2字符串結(jié)尾之前,出現(xiàn)了不等的情況,則結(jié)果本輪比較,繼續(xù)進(jìn)行下一輪比較,否則查找子串str2成成,返回str1中本輪開始對(duì)比的位置。

程序如下:

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中對(duì)比字符的起始位置

psub = str2;

while (*psub != '\0') //從pcur所標(biāo)示的位置開始依次與psub中的每一個(gè)字符進(jìn)行比較

{

if (*pcur != *psub) //如果出現(xiàn)字符不相等,則結(jié)束本次循環(huán)指針移動(dòng)到下一個(gè)位置

break;

pcur++;

psub++;

}

if (*psub == '\0') //如果到達(dá)子串結(jié)尾,則說明查找子串成功

return pstr;

pstr++; //pstr指向str1中的下一個(gè)字符串位置

}

return NULL;

}

使用自實(shí)現(xiàn)的mystrstr運(yùn)行上面的測(cè)試程序,結(jié)果如下:

至此,我們成功自實(shí)現(xiàn)了一個(gè)strstr函數(shù)。

本文版權(quán)歸傳智播客C/C++學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!

作者:傳智播客C/C++學(xué)院

首發(fā):http://xamj520.com/c/

0 分享到:
和我們?cè)诰€交談!