中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

字符串操作函數模擬之番外篇

發布時間:2020-08-08 18:16:28 來源:網絡 閱讀:639 作者:劉二陽二陽 欄目:編程語言

一、strchr()

  函數原型:char *strchr( const char *string, int c );

  strchr() 函數查找字符在指定字符串中首次出現的位置,如果找到,就返回指定字符在已知字符串中最后一次開始出現的位置,找不到就返回NULL。例如:已知字符串“abdedef”,該函數返回“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()

  函數原型:char *strrchr( const char *string, int c );

  strrchr()函數正好與strchr()函數相反,此函數是查找字符在指定字符串中從正面開始數最后一次出現的位置,若找到,就返回最后一次開始出現的位置,否則返回NULL。還用上邊的字符串為例,該函數返回的是結果是“def”

下面看三種實現方法:

1.從正面數,保存每個位置,則最后一次找到的即為最后一次出現的字符

char *my_strrchr(const char *str,int c)     
{
	const char *p = NULL;
	assert(str);
	while(*str)
	{
		
		if(*str == c)
		{
			p = str;            //保存每一次出現該字符的地址
		}
		str++;
	}
	if(*str != '\0')
		return (char *)p;
	return NULL;
}

2.從后面數,遇到的第一個字符即為最后一次出現的字符

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.調用strchr函數

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()

    我們都知道在庫函數中有strstr(),它是查找自字符串的,但是類似于上邊,我們要是想實現一個函數來返回子字符串在指定字符串中最后一次出現的位置該怎么做呢?!

下面看兩種實現方法:

1.從后向前找字符串(由于這種查找凡事不能再遇到'\0',所以不能以'\0'作為循環條件,而用字符串的長度來控制循環)

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;
}	

顯然這種方法有點麻煩,而且傳參太多。那么就有第二種實現方法了。

2.同實現strrchr一樣,調用strstr函數

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;
}



向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

景德镇市| 桓仁| 南华县| 台前县| 黔西县| 奉节县| 垫江县| 铅山县| 襄城县| 乌兰察布市| 镇江市| 哈密市| 信阳市| 阿巴嘎旗| 治多县| 清新县| 天津市| 天门市| 深水埗区| 东明县| 临夏县| 沈阳市| 湘乡市| 宁南县| 延川县| 卢湾区| 全南县| 琼海市| 西华县| 北票市| 松原市| 喀喇沁旗| 安达市| 元朗区| 马尔康县| 潜山县| 枝江市| 什邡市| 威信县| 万载县| 台东县|