strstr函数和strtok函数的使用

目录:

  1. strstr函数的使用
  2. 模拟实现strstr函数
  3. strtok函数的使用

strstr函数定义:strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;否则,返回NULL。

这是msdn里的函数定义:

 

 


1.strstr函数的简单使用: 

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<string.h>
int main()
{
	char email[] = "zpwbitejiuyeke.com";//定义一串字符
	char substr[] = "bitejiuyeke";//定义一串子字符
	char* ret = strstr(email, substr);//ret来接收找到的字符串,类型是char*
	if (ret == NULL)//如果指针为空指针就找不到
	{
		printf("找不到字符串\n");
	}
	else
	{
		printf("%s\n",ret);//找到字符串就打印ret
	}
	return 0;
}

如果有就找到了substr的内容并原文输出,没有就找不到字符串.

 2.自己实现strstr函数,这里分两种情况考虑:

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strstr(const char* str1, const char* str2)//const修饰str的内容不做改变,返回类型为char*
{
	assert(str1 && str2);//断言两个指针有意义不为空指针
	const char* s1 = str1;//s1初始化成str1
	const char* s2 = str2;//s2初始化成str2
	const char* p = str1;//p记录str1的起始位置
	while (*p)//*p不等于'\0'
	{
		s1 = p;//s1从p的位置开始匹配
		s2 = str2;//s2从str2的位置开始
		while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)//*s1*和s2遇到'\0'就停止循环
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return(char*)p;//如果s2查完了就返回起始位置p,注意返回的类型是char*
		}

		p++;//while循环如果没有匹配成功让p走一步,从下一个位置又开始匹配进入循环
	}
		return NULL;//找不到返回空指针
}

int main()
{
	char email[] = "zpwbitejiuyeke.com";//定义一串字符
	char substr[] = "bitejiuyeke";//定义一串子字符
	char* ret = my_strstr(email, substr);//ret来接收找到的字符串,类型是char*
	if (ret == NULL)//如果指针为空指针就找不到
	{
		printf("找不到字符串\n");
	}
	else
	{
		printf("%s\n", ret);//找到字符串就打印ret
	}
	return 0;
}

运行结果没问题:

3strtok函数的使用:

strtok函数定义:分解字符串为一组字符串。s为要分解的字符,delim为分隔符字符(如果传入字符串,则传入的字符串中每个字符均为分割符)。首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。

这是msdn里的函数定义:

 

 

 简单完成了一下代码,这个代码一个弊端就是ret接收的字符串不能为空指针(NULL),我们才打印ret,如果为空指针就打印空指针!

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<string.h>
#include<assert.h>
int main()
{
	const char* sep = "@.";//sep参数是一个字符串,定义了用作分隔符的字符集合
	//字符串里面有@和.两个分隔符哟!
	char email[] = "zhangsan@bitejiuyeke.com";//email里面放了待切割的字符串
	char cp[30] = { 0 };//假设cp里放了30个字符
	strcpy(cp, email);//拷贝email的数据放在cp里面
	char* ret=strtok(cp, sep);//因为strtok函数会改变被操作的字符串,所以一般切割临时拷贝的字符串cp
	//ret来接收被分割的字符串,类型为char*
	printf("%s\n", ret);
	ret = strtok(NULL, sep);//strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针
	//strtok函数的第一个参数不为NULL,函数将找到str的第一个标记,str字符串保存它在字符串中的位置
	printf("%s\n", ret);
	ret = strtok(NULL, sep);
	printf("%s\n", ret);
	//第四次的时候找不到这个字符串了,所以会打印空指针(NULL)
	ret = strtok(NULL, sep);
	printf("%s\n", ret);
	return 0;
}

运行结果和料想的一样:

优化一下代码,不管你分割多少断字符,都不会打印空指针!

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<string.h>
#include<assert.h>
int main()
{
	const char* sep = "@.";//sep参数是一个字符串,定义了用作分隔符的字符集合
	//字符串里面有@和.两个分隔符哟!
	char email[] = "zhangsan@bitejiuyeke.com.net";//email里面放了待切割的字符串
	char cp[40] = { 0 };//假设cp里放了30个字符
	strcpy(cp, email);//拷贝email的数据放在cp里面
	char* ret = NULL;//初始化ret为空指针
	for (ret = strtok(cp, sep); ret != NULL; ret = strtok(NULL, sep))
//初始化ret=strtok执行一次,ret不为空指针有意义,就打印分割前的字符串,第二次调用str传空指针,
//然后分隔符,如果ret不为空指针就打印ret
	{
		printf("%s\n", ret);
	}
	return 0;
}

 运行结果:

 

 以上是我对库函数strstr和strtok的学习理解以及代码注释,个人能力有限不足之处多多指教,你们有没有学到呢?

 

 

 

 

 

 

 

 

 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神之子-小佳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值