这种用到简单的字符串匹配算法,后面刷算法导论时再给出KMP算法吧
一 串的基本运算
1、求串长
int strlen(char *s);//求串s的长度
【例】printf("%d",strlen(s1)); //输出s1的串长12
2、串复制
char *strcpy(char *to,*from);//将from串复制到to串中,并返回to开始处指针
【例】strcpy(s3,s1); //s3="dir/bin/appl",s1串不变
3、联接
char *strcat(char *to,char *from);//将from串复制到to串的末尾,
//并返回to串开始处的指针
【例】strcat(s3,"/"); //s3="dir/bin/appl/"
strcat(s3,s2); //s3="dir/bin/appl/file.asm"
4、串比较(别把用成字符比较函数)
int strcmp(char *s1,char *s2);//比较s1和s2的大小,
//当s1<s2、s1>s2和s1=s2时,分别返回小于0、大于0和等于0的值
【例】result=strcmp("baker","Baker"); //result>0
result=strcmp("12","12"); //result=0
result=strcmp("Joe","joseph") //result<0
5、字符定位
char *strchr(char *s,char c);//找c在字符串s中第一次出现的位置,
//若找到,则返回该位置,否则返回NULL
【例】p=strchr(s2,'.'); //p指向"file"之后的位置
if(p) strcpy(p,".cpp"); //s2="file.cpp"
二 匹配算法
#include <stdio.h>
#include <stdlib.h>
#define MAxStr 100
typedef struct //定义顺序串结构体
{
char data[MAxStr];
int length;
}SqString;
void StrAssign(SqString *str,char cstr[])//由串常量cstr创建str
{
int i;
for(i=0;cstr[i]!='\0';i++)
str->data[i] = cstr[i];
str->length = i;
}
void DispStr(SqString s)//输出串内容
{
int i;
if(s.length>0)
{
for(i=0;i<s.length;i++)
printf("%c",s.data[i]);
printf("\n");
}
}
int Index(SqString s,SqString t)//简单匹配算法,长串,子串
{
int i = 0,j = 0,k;
while(i<s.length&&j<t.length)
{
if(s.data[i]==t.data[j])//继续匹配下一个字符串
{
i++;
j++;
}
else
{
i = i-j+1;//长串回溯
j = 0;//子串回溯
}
}
if(j>=t.length)
k = i-t.length;//返回匹配成功的第一个字符下标
else
k = -1;
return k;
}
int main()
{
SqString s,t;
StrAssign(&s,"abcabcdabcdeabcdefabcdefg");
StrAssign(&t,"abcdeabcdefab");
printf("串s:");DispStr(s);
printf("串t:");DispStr(t);
printf("简单匹配P算法:\n");
printf(" t在s中的位置=%d\n",Index(s,t));
}