最近我在做一道题目,具体的意思是:要求用户写入两个字符串,然后做比较,看看第二个字符串是否在第一个字符串中是否包含,如果包含,那说明在第一个字符串中的什么位置!我想 了写时候,编程思想都没有想出来!求救!我知道用字符串比较函数吧!
#include<string.h>
int match(char *s1,char *s2)
/*匹配函数,-1,出错 0没有找到匹配*/
{
int m,n,i,j;
char *p,*q;
m=strlen(s1);n=strlen(s2);
int match(char *s1,char *s2)
{
int i,j;
if(strlen(s2)>strlen(s1)
{
printf("error");
return -1;
}
for(i=0;i<strlen(s1);i++)
{
p=s1+i;
for(j=0;j<strlen(s2);j++)
{
q=s2+j;
if(*p!=*q)
break;
p++
}
if(*q=='\0')
return i;
}
return 0;
}
main()
{
char a[80];
char b[20];
int i;
printf("Pleashe input two strings\n");
gets(a);
gets(b);
i=match(a,b);
if(i>0)
printf("the string is matched\n");
else
printf("the strings are not matched\n");
}
兄弟,随便写写的不知道有没有错!
[此贴子已经被作者于2006-8-2 7:31:37编辑过]
贴个效率高一点的,几个星期前学习串操作时写的KMP子串查找法,写了详细注释了,书上有KMP偏量计算的子函数,这里我全部省略了,合进了一个函数中,进行实时偏量计算。
#include <stdio.h>
#include <conio.h>
inline int KMP(char *s,char *p);
int main() {
char *s1 = "abacabcdabbab";
char *s2 = "abc";
printf("index = %d\n",KMP(s1,s2));
getch();
return 0;
}
/************************************************
*
* 函数名: KMP
*
* 参数表: s - 主串的指针; p - 模式串的指针
*
* 功能介绍: 比较p是否为s的子串,若是则返回在
* s中起始的索引号。
*
************************************************/
inline int
KMP(char *s, char *p) {
char *ptr_s = s; /* 映射字符串指针s */
char *ptr_p = p; /* 映射字符串指针p */
char *ptr_bak = s; /* 用于定位在*ptr_s与*p内容相同的位置 */
int addr_delta; /* 计算相匹配的内容长度,调整ptr_p对比起始位置 */
while(*ptr_s && *ptr_p) {
if(*ptr_s == *ptr_p) {
/* 如果匹配字符与对比串的首字符相等,则备份该指针 */
if(*ptr_s == *p)
ptr_bak = ptr_s;
++ptr_s;
++ptr_p;
}
else {
/* 计算新位置与备份指针的差,这便是以匹配的字符数,从而使p+addr_delta获得开始匹配的起始位置 */
addr_delta = (int)(ptr_s - ptr_bak);
/* 若备份位置与当前位置相同,则将当前位置一下下一个位置,从头开始比较 */
if(!addr_delta) {
++ptr_s;
ptr_bak = ptr_s;
ptr_p = p;
}
else {
ptr_p = p + addr_delta;
/* 若备份位置与模式串的首位置都不匹配当前位置的字符串,则继续向后比较,重设备份位置和匹配位置 */
if(*ptr_p != *ptr_s && *p != *ptr_s) {
++ptr_s;
ptr_bak = ptr_s;
ptr_p = p;
}
else {
/* 若备份位置与当前位置字符不匹但与模式串首字符相匹,则重设匹配位置和备份位置 */
if(*p == *ptr_s) {
ptr_p = p;
ptr_bak = ptr_s;
}
}
}
}
}
if(*ptr_p)
return -1;
else
/* 计算索引 */
return (int)((ptr_s - s) - (ptr_p - p));
}
[此贴子已经被作者于2006-8-2 11:32:59编辑过]