目录
前言
再弄strstr时就突然想弄一个字符串函数专栏,及对自己知识的巩固,也让将来复习时方便一些,并且发到网上,也希望大佬可以指点指点,非常欢迎大家提出建议与问题。
这个顺序还是有的,但是得慢慢补,毕竟想法来的突然了一些。
函数简单介绍
引言
strstr----查找子串函数,即你有两个字符串,一个为father[] = "abcdef",一个名为son[] = "cde",你想知道或者就是有人让你用程序告诉他son是否被包含在father中,即son是否是father的一个子字符串,那么你就可以运用这个函数去简简单单的完成这件事情。(虽然很容易就看出来了,但你最好装作没看出来哦)
用法
在C中 char * strstr ( const char *str1, const char *str2 ),你只需要将str1换成father,将str2换成son,可是结果是什么怎么知道呢?看看它的返回值,一个字符指针,那是指向什么的?
这个被返回的指针,如果son是father的子串,那么就会返回son在father中对应的起始位置,在此例中就是返回 指针中存放(father + 2) 对应的地址也就是在father中的d所在的地址。
#include<stdio.h>
#include<string.h>
int main()
{
char father[] = "abcdef";
char son[] = "cde";
char* mid = strstr(father, son);
if (mid == father + 2)
printf("%s\n", mid);
else
printf("你骗人\n");
return 0;
}
可是那如果son[] = "cdf"呢,那就不好意思了,返回一个NULL空指针咯。
#include<stdio.h>
#include<string.h>
int main()
{
char father[] = "abcdef";
char son[] = "cdf";
char* mid = strstr(father, son);
if (mid == NULL)
printf("%s\n", mid);
else
printf("你骗人\n");
return 0;
}
简单实现(非KMP版)
代码处
查找是否是子字符串定是要进行比较的来判断是否被包含,总体思想就是正常情况下father有多少个字符(\0当然是不算的了),就进行多少轮比较。拿出father中的一个字符作为头,开始与son中的字符进行依次比较,如果遇见不符合就跳出此次比较,开始下一轮。
详情请见下面:(若有不懂之处,可以尝试耐心看完代码或许感觉会好一点)
char* my_strstr(const char* fher, const char* son)
{
assert(fher);
assert(son);
//从父字符串第一个字符开始,每一个字符串进行一轮查找
char* f1 = (char*)fher;//每一轮查找时用这个临时指针进行移动
char* s1 = (char*)son;//每一轮查找结束后,如果这轮未找到
//那么在进行下一轮时son肯定要归到起始位置,所以临时拷贝,让s1去移动,son中存储着起始地址
while (*son)//子字符串为空字符串查找也没意义了
{
while ((*s1) && (*f1) && (*f1 == *s1))
{
//s1此时不指向\0,f1此时不指向\0,且f1与s1所指向的字符一样才会进来
f1++;
s1++;
}
if (!*s1)//脱离前面的循环时的一种情况,就是*s1为\0,也就意味着\0之前的字符比较后是相同的,的一直比到了\0
return fher;
if (!*fher)//这种情况就是进行到了头仍未找到字串
return NULL;
f1 = ++(char*)fher;//开始下一轮比较的起始地址的赋值
s1 = (char*)son;//子串也得回到头重头开始新一轮比较
}
return fher;
}
int main()
{
char arr1[] = "abbbcdefge";
char arr2[] = "bbc";
//char* str = strstr(arr1, arr2);
char* str = my_strstr(arr1, arr2);
if (!str)
{
printf("没有找到\n");
}
else
{
printf("%s", str);
}
return 0;
}
其他
小歪例
感觉代码中的例子比较好,程序员还要是有一些发散性思维的。
库文件
这个可以自己去在本地文件去搜索看一下,有点太长了,我就不拿来凑字数了。