目录:
- strstr函数的使用
- 模拟实现strstr函数
- 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的学习理解以及代码注释,个人能力有限不足之处多多指教,你们有没有学到呢?