C语言 实现strstr、strtok函数功能

目录

一、strstr函数

二、strtok函数实现


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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值