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

函数接口定义:

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
分析:一开始的想法是,找到第一个于字串相同的字符,然后迅速比对,寻找以及比对的方式如下:
 1 char *search(char *s, char *t)
 2 {
 3     char *p;
 4     for(;*s!='\0';s++)
 5     {
 6         if(*s==*t)
 7             break;
 8     }
 9     if(*s=='\0')\
10     return NULL;
11     p=s;
12     for(;*t!='\0';t++,s++)
13     {
14         if(*t!=*s)
15             break;
16     }
17     if(*t!='\0')
18         return NULL;
19     else
20         return p;
21 }

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

输入

qwerert

ert

输出

-1

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

 1 #include <cstring>
 2 #define MAXS 30
 3 
 4 using namespace std;
 5 
 6 int is(char *p1,char *p2)
 7 {
 8     char *s=p1,*t=p2;
 9     for(;*t != '\0'||*s != '\0';t++,s++)
10     {
11         if(*t!=*s)
12         {
13             break;
14         }
15     }
16     if(*t!='\0')
17         return 0;
18     else
19         return 1;
20 }
21 char *search(char *s, char *t)
22 {
23     char *p;
24     for(;*s!='\0';s++)
25     {
26         if(*s==*t)
27         {
28             p=s-1;
29             if(is(s,t))
30                 break;
31             else
32                 t++;
33         }
34 
35     }
36     if(*s == '\0')
37         return NULL;
38     return p;///´Ë´¦Óиöbug
39 }
40 
41 int main()
42 {
43     char s[MAXS], t[MAXS], *pos;
44 
45     cin.getline(s,MAXS);
46     cin.getline(t,MAXS);
47     pos = search(s, t);
48     if ( pos != NULL )
49         printf("%d\n", pos - s);
50     else
51         printf("-1\n");
52 
53     return 0;
54 }

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

 1 char *search(char *s, char *t)
 2 {
 3     int lens=strlen(s);
 4     int lent=strlen(t);
 5     int i,j,k;
 6     int x=lens-lent;
 7     for (i=0; i<=x; i++)
 8     {
 9         for (j=0,k=i; j<lent; j++,k++)
10         {
11             if (s[k]!=t[j]) break;
12         }
13         if (j==lent)
14             break;
15     }
16     if (i<=x) return s+i;
17     else return NULL;
18 }

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

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

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

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

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

(其实,还有一种KMP模式匹配,更高效,请看下文)

优质内容筛选与推荐>>
1、太久没有更新了~
2、HDU2824【欧拉函数性质】
3、01、启动优先和安全设置
4、java html实体转义
5、peizhiwenjian


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn