标准库中存在许多函数,它们用各种不同的方法查找字符串,像strstr,strchr和strrchr等等.这些各种各样的工具给了c程序员很大的灵活性,为了更好地了解它们的作用,下来我们将它们一一模拟实现。
首先我们来看看strstr和strrstr:
strstr的原型:char *strstr(const char *s1,const char *s2);
而strrstr这个函数在标准库中是不存在的...
它们都是为了在字符串中查找一个子串,区别在于strstr这个函数在s1中查找整个s2第一次出现的起始位置(strrstr是在s1中查找整个s2最后一次出现的起始位置),并返回一个指向该位置的指针。如果s2并没有完整的出现在s1的任何地方,函数将返回一个NULL指针。如果s2是一个空字符串,函数将返回s1.
接下来我们就先模拟实现一下strstr:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char *my_strstr(const char *str,const char *arr)
{
const char *pstr=str;
const char *parr=arr;
const char*start=NULL;
assert(str);
assert(arr);
while(*pstr)
{
start=pstr;
while(*pstr&&*parr&&*pstr==*parr)
{
pstr++;
parr++;
}
if(*parr=='\0')
return (char*)start;
pstr=start+1;
parr=arr;
}
return 0;
}
int main()
{
char *ret=NULL;
char arr[]="there here";
char *str="re";
ret=my_strstr(arr,str);
printf("%s\n",ret);
system("pause");
return 0;
}
这个运行结果应当是re here,那么到底是不是这样呢?继续往下看!
看来结果和我们的预想是一样的哦!
我们再来对比一下strrstr这个函数:
<span style="font-size:18px;"><strong>#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char *my_strrstr(const char *str,const char *arr)
{
const char *pstr=str;
const char *parr=arr;
const char *first=NULL;
const char *second=NULL;
assert(str);
assert(arr);
while(*pstr)
{
first=pstr;
while(*pstr&&*parr&&*pstr==*parr)
{
pstr++;
parr++;
}
if(*parr=='\0')
second=first;
pstr=first+1;
parr=arr;
}
if(*pstr=='\0')
return (char *)second;
return 0;
}
int main()
{
char *ret=NULL;
char arr[]="there here";
char *str="re";
ret=my_strrstr(arr,str);
printf("%s\n",ret);
system("pause");
return 0;
}</strong></span>
同样的一组字符串在这里又会得到什么结果呢?
这个函数就是要返回我们所要查找字符串在主字符串中最后一次完整出现的起始位置,输出从这个位置开始的后面的字符串。看来这个结果就印证了我们的猜想!
那么如果要查找的这个字符串在主串中并没有完整出现呢?结果又会怎样...
返回为空,这样的话我们可以在主函数中用选择语句改一下输出就更明白了。
然后呢我们将进入strchr和strrchr这组函数中:
它们的原型为:char *strchr(const char *str,int ch);
char *strrstr(const char *str,int ch);
它们呢都是用于在一个字符串中查找一个特定的字符,区别在于strchr在字符串str中查找字符ch第一次出现的位置(而strrchr在str中查找字符ch最后一次出现的位置),找到后函数返回一个指向该位置的指针。如果该字符并不存在于字符串中,函数就返回一个NULL指针。
注意它们的第二个参数是一个整型值,但是它包含了一个字符值。因为字符在计算机以ASCII码的形式存储,当定义为整形时反而提高了它的存储范围。
下来先模拟实现一下strchr:
<span style="font-size:18px;"><strong>#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char *my_strchr( const char *str,int ch)
{
const char *pstr=str;
assert(str);
while(*pstr!='\0')
{
if(*pstr==ch)
return (char*)pstr;
else //找到后函数返回一个指向该位置的指针
pstr++;
}
return NULL;
}
int main()
{
char arr[]="fabcdae";
char *ret=my_strchr(arr,'a');
printf("%s",ret);
system("pause");
return 0;
}</strong></span>
结果应当为abcdae,那么到底是不是这样的呢,我们来看看运行结果:
看来这个函数就是这样的作用的!!!
那么对于同样的字符串,查找同样的字符,用strrchr会有什么样的结果呢?
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char *my_strrchr(const char *str,int ch)
{
char *ptr=NULL;
const char *pstr=str;
assert(str);
while(*pstr!='\0')
{
if(*pstr==ch)
ptr=(char *)pstr; //先记住第一次的位置,如果其后不再出现就返回一个指向该位置的指针
pstr++;
}
return ptr; //返回最后一次出现的目标字符的位置
return 0;
}
int main()
{
char arr[]="fabcdae";
char *ret=my_strrchr(arr,'a');
printf("%s\n",ret);
system("pause");
return 0;
}
运行结果印证了strrchr就是用来返回目标字符在主字符串中最后一次出现的位置。
以上就是个人对字符串查找的一些基本理解,初学者能力有限有什么需要改进的地方希望大家多多指出。