strstr模拟实现 && strtok使用

举报
芒果_Mango 发表于 2022/02/26 21:41:02 2022/02/26
【摘要】 模拟实现strstr注意:遍历两个字符串进行比较,定义3个指针,一个指针用于遍历主字符串,一个指针用于遍历字符串,一个指针用于保存主串开始遍历的位置(方便后序返回子串在主串的起始位置)当子字符串走到\0时,说明找到了,当主子符串走到\0时,要么主字符串和子字符串相等,要么就是找不到当子字符串为空字符串时,返回主字符串的起始地址(库函数就是这么写的)![image.png](https://...

模拟实现strstr

注意:遍历两个字符串进行比较,定义3个指针,一个指针用于遍历主字符串,一个指针用于遍历字符串,一个指针用于保存主串开始遍历的位置(方便后序返回子串在主串的起始位置)

当子字符串走到\0时,说明找到了,

当主子符串走到\0时,要么主字符串和子字符串相等,要么就是找不到

当子字符串为空字符串时,返回主字符串的起始地址(库函数就是这么写的)

![image.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d384a8b4ebe74fa1bc95e600d3cf9d12~tplv-k3u1fbpfcp-watermark.image?)
//返回子串出现在主串的第一个位置
char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	char* s1;	//用来遍历str1
	char* s2;	//用来遍历str2
	char* cp = str1;	//用于保存主子符串开始遍历的位置

	//如果str2为空字符串,直接返回str1的地址
	if (*str2 == '\0')
	{
		return str1;
	}
	//遍历主串与子串比较
	while (*cp)
	{
		s1 = cp;	//s1从cp位置开始向后比较
		s2 = str2;	//s2回到原始位置
		while ((*s1 == *s2)&&*s1&&*s2)	//不仅要保证二者指向字符相等,还要保证s1和s2指向的不是\0
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return cp;	//返回子串在主串的起始位置
		}
		else
		{
			//s1和s2指向不相等,cp指向下一个字符,然后下一次循环,把cp的值赋给s1用于下次遍历
			cp++;
		}
	}
	//跳出while循环时,说明主串都遍历完了,说明找不到->返回NULL
	return NULL;
}
int main()
{
	char* str1 = "MangoLemon";
	char* str2 = "an";
	char* tmp = strstr(str1, str2);
	char* tmpp = my_strstr(str1, str2);
	printf("%s\n", tmp);
	printf("%s\n", tmpp);
	return 0;
}

strtok - 字符串切割

image.png


  • 第二个参数是个字符串,定义了用作分割字符串的集合
  • strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针(注意:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容且可修改)
  • strtok函数的第一个参数不为NULL时:函数将找到str中第一个标记,strtok函数将保存它在字符串中位置
  • strtok的第一个参数为NULL时,函数将在同一个字符串中被保存的位置开始,查找下一个标志
  • 如果字符串中不存在更多的标志,就返回NULL

image.png


int main()
{
    char arr1[] = "Mango@Lemon.Jiayou";
    char arr2[100] = {0};	//防止strtok函数改变arr1中的数据,使用临时数组arr2
	char sep[] = "@.";	//分割字符串的集合,即遇到@ 或者.就分割字符串
    strcpy(arr2,arr1);
    char* ret = NULL;
    //分割字符串
    //注意:第一次传传参为arr2,后序传参都传NULL
    for(ret = strtok(arr2,sep); ret != NULL; ret = strtok(NULL,sep))
    {
        printf("%s\n",ret);
    }
    //相当于
    //char* ret2 =strtok(arr2, sep);
	//printf("%s\n", ret2);
	//ret2 =strtok(NULL, sep);
	//printf("%s\n", ret2);
}

打印结果:

image.png


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。