本題要求實現一個字元串查找的簡單函數。 函數介面定義: 函數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。