strstr模拟实现 && strtok使用
【摘要】 模拟实现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 - 字符串切割
- 第二个参数是个字符串,定义了用作分割字符串的集合
- strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针(注意:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容且可修改)
- strtok函数的第一个参数不为NULL时:函数将找到str中第一个标记,strtok函数将保存它在字符串中位置
- strtok的第一个参数为NULL时,函数将在同一个字符串中被保存的位置开始,查找下一个标志
- 如果字符串中不存在更多的标志,就返回NULL
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);
}
打印结果:
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)