一、strchr()

函數(shù)原型:char *strchr( const char *string, int c );
strchr() 函數(shù)查找字符在指定字符串中首次出現(xiàn)的位置,如果找到,就返回指定字符在已知字符串中最后一次開始出現(xiàn)的位置,找不到就返回NULL。例如:已知字符串“abdedef”,該函數(shù)返回“dedef”
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
char *my_strchr(const char *str,int c)
{
assert(str);
while(*str)
{
if(*str == c)
return (char *)str; //找到后返回此時的位置
str++;
}
return NULL; //沒找到
}
int main()
{
char *str = "abcdcdef";
char *ret = my_strchr(str,'d');
printf("%s\n",ret);
system("pause");
return 0;
}二、strrchr()
函數(shù)原型:char *strrchr( const char *string, int c );
strrchr()函數(shù)正好與strchr()函數(shù)相反,此函數(shù)是查找字符在指定字符串中從正面開始數(shù)最后一次出現(xiàn)的位置,若找到,就返回最后一次開始出現(xiàn)的位置,否則返回NULL。還用上邊的字符串為例,該函數(shù)返回的是結(jié)果是“def”
下面看三種實(shí)現(xiàn)方法:
1.從正面數(shù),保存每個位置,則最后一次找到的即為最后一次出現(xiàn)的字符
char *my_strrchr(const char *str,int c)
{
const char *p = NULL;
assert(str);
while(*str)
{
if(*str == c)
{
p = str; //保存每一次出現(xiàn)該字符的地址
}
str++;
}
if(*str != '\0')
return (char *)p;
return NULL;
}2.從后面數(shù),遇到的第一個字符即為最后一次出現(xiàn)的字符
char *my_strrchr(const char *str,int ch)
{
const char *start = str; //將指定字符串首地址保存
assert(str);
while(*str)
{
str++;
}
//str--;
//while(*str--)
//{
// ;
//}
while((str >= start) && (*str != ch))
{
str--;
}
if(*str == ch)
return (char *)str;
return NULL;
}3.調(diào)用strchr函數(shù)
char *my_strrchr(const char *str,int ch)
{
const char *cur = NULL;
const char *last = NULL;
assert(str);
while(cur = strchr(str,ch))
{
last = cur; //保存每一次找到的位置
str = cur+1;
}
return (char *)last;
}三、strrstr()
我們都知道在庫函數(shù)中有strstr(),它是查找自字符串的,但是類似于上邊,我們要是想實(shí)現(xiàn)一個函數(shù)來返回子字符串在指定字符串中最后一次出現(xiàn)的位置該怎么做呢?!
下面看兩種實(shí)現(xiàn)方法:
1.從后向前找字符串(由于這種查找凡事不能再遇到'\0',所以不能以'\0'作為循環(huán)條件,而用字符串的長度來控制循環(huán))
char *my_strrstr(const char *str,const char *substr,int len1,int len2)
{
const char *l_start = str+len1-1;
const char *end = substr+len2-1;
assert(str);
assert(substr);
while(len1)
{
str = l_start;
while((len2 != 1) && (*substr == *str))
{
str--;
substr--;
len2--;
}
l_start = str;
if(len2 == 1)
return (char *)l_start;
if(*str != *substr)
{
l_start = l_start-1;
substr = end;
}
len1--;
}
return NULL;
} 顯然這種方法有點(diǎn)麻煩,而且傳參太多。那么就有第二種實(shí)現(xiàn)方法了。
2.同實(shí)現(xiàn)strrchr一樣,調(diào)用strstr函數(shù)
char *my_strrstr(const char *str,const char *substr)
{
const char *last = NULL;
const char *cur = NULL;
assert(str);
if(!*substr)
return (char *)substr;
while(cur = strstr(str,substr))
{
last = cur; //每次保存找到的字符串的首位置
str = last+1; //使str指向下一位開始尋找
}
return (char *)last;
}另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
當(dāng)前題目:字符串操作函數(shù)模擬之番外篇-創(chuàng)新互聯(lián)
網(wǎng)址分享:http://www.chinadenli.net/article46/dgedeg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、定制開發(fā)、網(wǎng)站維護(hù)、網(wǎng)站設(shè)計(jì)、營銷型網(wǎng)站建設(shè)、用戶體驗(yàn)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容