本題要求實現一個字符串查找的簡單函數。
函數接口定義:
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模式匹配,更高效,請看下文)