欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

查找子串

程序员文章站 2022-04-06 12:39:04
本题要求实现一个字符串查找的简单函数。 函数接口定义: 函数search在字符串s中查找子串t,返回子串t在s中的首地址。若未找到,则返回NULL。 裁判测试程序样例: 输入样例1: 输出样例1: 输入样例2: 输出样例2: char *search(char *s, char *t){ char ......

本题要求实现一个字符串查找的简单函数。

函数接口定义:

char *search( char *s, char *t );

函数search在字符串s中查找子串t,返回子串t在s中的首地址。若未找到,则返回NULL。

裁判测试程序样例:

#include <stdio.h>
#define MAXS 30

char *search(char *s, char *t);
void ReadString( char s[] ); /* 裁判提供,细节不表 */

int main()
{
    char s[MAXS], t[MAXS], *pos;

    ReadString(s);
    ReadString(t);
    pos = search(s, t);
    if ( pos != NULL )
        printf("%d\n", pos - s);
    else
        printf("-1\n");

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例1:

The C Programming Language
ram

输出样例1:

10

输入样例2:

The C Programming Language
bored

输出样例2:

-1
分析:一开始的想法是,找到第一个于字串相同的字符,然后迅速比对,寻找以及比对的方式如下:

char *search(char *s, char *t)
{
char *p;
for(;*s!='\0';s++)
{
if(*s==*t)
break;
}
if(*s=='\0')\
return NULL;
p=s;
for(;*t!='\0';t++,s++)
{
if(*t!=*s)
{
break;
}
}
if(*t!='\0')
return NULL;
else
return p;
}

20分得18分,然后就知足了,放弃寻找bug得新年直接结束小测试;刚好位来自甚大得新萌陈老师来我大惠院随便看看,于是就请教一番,果然这纰漏自己很难想到:只是检查了一次而已,不小心吐槽了一下:怎么能只扣2分...言归正传,测试bug得输入如下:

输入

qwerert

ert

输出

-1

知道bug了,一切好办,在原来的基础上,维护了一下,完整代码如下:


int is(char *p1,char *p2)
{
char *s=p1,*t=p2;
for(;*t != '\0'||*s != '\0';t++,s++)
{
if(*t!=*s)
{
break;
}
}
if(*t!='\0')
return 0;
else
return 1;
}
char *search(char *s, char *t)
{
char *p;
for(;*s!='\0';s++)
{
if(*s==*t)
{
p=s-1;
if(is(s,t))
break;
else
t++;
}

}
if(*s == '\0')
return NULL;
return p;///´Ë´¦Óиöbug
}

int main()
{
char s[MAXS], t[MAXS], *pos;

cin.getline(s,MAXS);
cin.getline(t,MAXS);
pos = search(s, t);
if ( pos != NULL )
printf("%d\n", pos - s);
else
printf("-1\n");

return 0;
}

带着满脸的喜悦,去瞧了黄老师的代码:吃惊:

char *search(char *s, char *t)
{
int lens=strlen(s);
int lent=strlen(t);
int i,j,k;
int x=lens-lent;
for (i=0; i<=x; i++)
{
for (j=0,k=i; j<lent; j++,k++)
{
if (s[k]!=t[j]) break;
}
if (j==lent)
break;
}
if (i<=x) return s+i;
else return NULL;
}

接下来才是,从该程序中所学知识(通过两个程序的对比可得):

1.使用两层循环,可极力简约程序;

2.将字符串的长度显现出来,最大程度的发挥了数组较之于指针的优点;

3.数组较之于指针的有点是,可明确指向该数组的具体哪个元素,而且首元素地址不会丢失,这样二层循环才能的到支持。

能学到这么多,足矣。题目来自PTA。