目录
一、strstr函数
strstr函数基本用法:
strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;否则,返回NULL
接下来我们封装实现strstr功能
代码思路:
创建名为 mystrstr函数,传入2个字符串
1.首先利用assert函数来判断传入的字符串是否为空,若为空,代码运行中止。
2.将str分别赋值给 s1,s2
3.整体的while循环在主串s1上进行,设置一个标志位tmp,用tmp进行操作
4.比较两个字符串,若不同或者指针指向'\0',则s1++。若满足条件,标志位++,直到不满足循环条件,此时进行判断,若tmp2 == \0 ,说明s2已经比较完毕,为s1的子串,此时从开始比较的s1开始,返回s1,完成函数功能。
说明:这里设置tmp是为了方便后面s1的输出,每次比较完毕将tmp都重新赋值新的s1,因为返回值需要从子串首元素进行返回,我们在比较时保持s1不变,若完成功能直接输出。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
char *mystrstr(const char *str1, const char *str2)
{
assert(str1 != NULL && str2 != NULL);
const char *s1 = str1, *s2 = str2;
while (*s1 != '\0')
{
char *tmp1 = s1;
char *tmp2 = s2;
while (*tmp1 != '\0' && *tmp2 != '\0' && *tmp1 == *tmp2)
{
tmp1++;
tmp2++;
}
if (*tmp2 == '\0')
{
return s1;
}
s1++;
}
return NULL;
}
int main()
{
char *str1 = "nihe";
char *str2 = "ea";
printf("%s\n", mystrstr(str1, str2));
system("pause");
return 0;
}
二、strtok函数实现
char *strtok( char *scr, char *sep)
功能:字符串分割,将src字符串按照指定的分隔符分割出各个子字符串
注意:这个函数会改变src字符串本身
代码思想:
1.如果分割符为空,程序会崩溃,所以先进行判断.
如果分割符为0,那么直接返回字符串
2.如果传入了数据,则以src开始进行分割;
如果没有传入数据,传入了null,则表示对上一次的字符串进行分割
3.用res固定起始点,将分割符与字符串进行比较,遇到分割符便跳出循环。都不相同便一直ptr++
若遇到分割符,则把分割符变为\0,ptr后移一位继续开始循环。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
char *mystrtok(char *src, char *seps)
{
assert(seps != NULL);
if (strlen(seps) == 0)
{
return src;
}
static char *ptr;
if (src != NULL)
{
ptr = src;
}
char *res = ptr; //保存本次要返回子串的起始地址
while (*ptr != '\0')
{
char *sep = seps; //分割符可能有多个
while (*sep != '\0') //逐个判断
{
if (*sep == *ptr) //如果是分隔符,替换为\0
{
break;
}
sep++;
}
if (*sep != '\0')
{
*ptr = '\0';
ptr++;
return res;
}
ptr++;
}
return NULL;
}
int main()
{
char string = "ni h,eef,e";
char seps[] = " ,\t\n";
char *token;
token = mystrtok(string, seps);
while (token != NULL)
{
printf(" %s\n", token);
token = mystrtok(NULL, seps);
}
system("pause");
return 0;
}