📄 stringmatch.cpp
字号:
#include<iostream>
#include<cstring>
using namespace std;
char data[100][100];
int linenum; //number of lines
void branch(char *);
void simpleout(char *);
void checkargu(char *);
void printline(int, int *);
int sic(const char* ,const char* ,unsigned int );
main(){
char sp[100]; //sp=search pattern;
int i=0;
cout<<"Input string (enter X to stop): ";
cin.getline(data[0],100);
while(strcmp(data[i],"X")!=0){
i++;
cout<<"Input string (enter X to stop): ";
cin.getline(data[i],100);
}
linenum=i-1;
cout<<"Search pattern: ";
cin.getline(sp,100);
branch(sp);
getchar();
}
void branch(char *sp){
int withargu; //with argument
if(strstr(sp,"/")==0) {
withargu=0;
simpleout(sp);
}
else {
withargu=1;
checkargu(sp);
}
}
void simpleout(char *sp){
int i,t=0; //t=match numbers
int db[100]; //the index numbers of found lines
for(i=0;i<=linenum;i++){
if (strstr(data[i],sp)!=0) db[t++]=i;
}
printline(t-1,db); //t-1 is the maximun index of db
}
void checkargu(char *sp){
int i,j,k,m,q,r=0,insensi=0,begin=0,end=0,any=0;
char letter[50][100]; //letters in sp if any==1
for(i=0;*(sp+i)!='/';i++) ;
*(sp+i)='\0';
for(i++;*(sp+i)!='\0';i++){
if(*(sp+i)=='i') insensi=1;
else if(*(sp+i)=='b') begin=1;
else if(*(sp+i)=='e') end=1;
else if(*(sp+i)=='a') any=1;
}
//execution is below
if(any){
for(i=0;*(sp+i)!='\0';i++)
{letter[i][0]=*(sp+i); letter[i][1]='\0';}
}
else {strcpy(letter[0],sp); i=1; }
i--; //now i is the maximum row index of letter[]
int (*fp)(const char *,const char *,unsigned int);
char temp[50];
char outline[50][100];
unsigned int len;
int beginn,endn;
if(insensi) fp=sic;
else fp=strncmp;
for(j=0;j<=i;j++){
len=strlen(letter[j]);
for(q=0;q<=linenum;q++){
if(data[q][0]=='\0') continue;
if (begin==1) endn=0;
else endn=strlen(data[q])-len;
if (end==1) beginn=strlen(data[q])-len;
else beginn=0;
for(m=beginn;m<=endn;m++) {
for(k=0;k<=len-1;k++)
{temp[k]=data[q][m+k]; }
temp[k]='\0';
if((*fp)(temp,letter[j],len)==0) {strcpy(outline[r++],data[q]);
data[q][0]='\0';
break;}
}
}
}
cout<<"Number of matched strings: "<<r<<endl;
for(i=0;i<=r-1;i++)
cout<<outline[i]<<endl;
}
void printline(int n, int *db){
int i;
cout<<"Number of matched strings: "<<n+1<<endl;
for(i=0;i<=n;i++)
cout<<data[*(db+i)]<<endl;
}
int sic(const char* datastr,const char* cmdstr,unsigned int len){
int i;
for(i=0;i<=len;i++){
if (('a'<=*(datastr+i))&&('z'>=*(datastr+i))){
if((*(datastr+i)!=*(cmdstr+i))&&(*(datastr+i)-32!=*(cmdstr+i))) break;
}
else if((*(datastr+i)!=*(cmdstr+i))&&(*(datastr+i)+32!=*(cmdstr+i)) ) break;
}
if (i<=len) return(1);
else return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -