#define _STRING_H_
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1
typedef int Status;
{
char *ch;
int length;
}HString;
Status ClearString(HString &S);
int Strlength(HString S);
Status Concat(HString &T,HString S1,HString S2);
Status SubString(HString &Sub,HString S,int pos,int len);
Status Strindex(HString S,HString T,int pos);
void print(HString S);
#endif
#include<iostream>
#include<string>
using namespace std;
//初始化字符串
Status StrAssign(HString &T,char chars[])
{
char *c;
int i=0,j;
if(T.ch)
{
T.ch = NULL;
}
for (i = 0, c = chars; *c; ++i, ++c);
{
exit(OVERFLOW);
}
else
{
for(j=0;j<i;j++)
{
T.ch[j]=chars[j];
}
T.length=i;
}
return OK;
}
Status ClearString(HString &S)
{
if(S.ch)
{
free(S.ch);
S.ch=NULL;
}
S.length=0;
return OK;
}
int Strlength(HString S)
{
return S.length;
}
Status Concat(HString &T,HString S1,HString S2)
{
int i,j;
if(T.ch)
{
free(T.ch);
}
if(!(T.ch=(char*)malloc((S1.length+S2.length)*sizeof(char))))
{
exit(OVERFLOW);
}
else
{
for(i=0;i<S1.length;i++)
{
T.ch[i]=S1.ch[i];
}
T.length=S1.length+S2.length;
for(j=S1.length;j<T.length;j++)
{
T.ch[j] = S2.ch[j-S1.length];
}
return OK;
}
}
Status SubString(HString &Sub,HString S,int pos,int len)
{
int i,j=0;
if(pos<1||pos>S.length||len<0||len>S.length-pos+1)
{
return ERROR;
}
if(Sub.ch)
{
free(Sub.ch);
}
if(!len)
{
Sub.ch=NULL;
Sub.length=0;
}
else
{
Sub.ch=(char*)malloc(len*sizeof(char));
for(i=pos-1,j=0;i<pos+len-2,j<len;i++,j++)
{
Sub.ch[j] = S.ch[i];
}
Sub.length = len;
}
return OK;
}
Status Strindex(HString S,HString T,int pos)
{
int i=pos-1,j=0;
if(pos<1||pos>S.length)
{
return ERROR;
}
while(i<S.length&&j<T.length)
{
if(S.ch[i]==T.ch[j])
{
i++;
j++;
}
else
{
i=i-j+1;
j=0;
}
}
if(j>T.length-1)
{
return i-T.length+1;
}
else
{
return ERROR;
}
}
//遍歷
void print(HString S)
{
int i;
if(S.length!=0)
{
for(i=0;i<S.length;i++)
{
cout<<S.ch[i];
}
}
cout << endl;
}
#include<iostream>
#include<string>
using namespace std;
{
char chars1[10], chars2[20] , chars3[20] ,chars4[20] ;
int i, select, pos, len;
HString T,S,S1,S2,Sub;
T.ch = NULL;
T.length = 0;
S.ch = NULL;
S.length = 0;
S1.ch = NULL;
S1.length = 0;
S2.ch = NULL;
S2.length = 0;
Sub.ch = NULL;
cout << "請輸入字符串chars1:" << endl;
cin.get(chars1, 10);
StrAssign(S, chars1);
//print(S);
do
{
cout << "1.連接兩個字符串!" << endl;
cout << "2.求子串!" << endl;
cout << "3.模式匹配!" << endl;
cout << "0.操作結束!" << endl;
cout << "請選擇:" << endl;
cin >> select;
cin.sync();//清空緩存區域
switch (select)
{
case 1:
cin.sync();
cout << "請輸入字符串chars2:" << endl;
cin.get(chars2, 5);
StrAssign(S1, chars2);
getchar();
cout << "請輸入chars3:" << endl;
cin.get(chars3, 4);
StrAssign(S2, chars3);
//print(S2);
cin.sync();
if (Concat(T, S1, S2) == OK)
{
print(T);
}
break;
case 2:
cout << "請輸入位置:" << endl;
cin >> pos;
cout << "請輸入子串的長度:" << endl;
cin >> len;
if (SubString(Sub, S, pos, len) == ERROR)
{
cout << "位置或長度輸入不合法!" << endl;
}
else
{
print(Sub);
}
break;
case 3:
cin.sync();
cout << "請輸入chars4:" << endl;
cin.get(chars4, 3);
StrAssign(T, chars4);
cin.sync();
//print(T);
cout << "請輸入位置:" << endl;
cin >> pos;
if (Strindex(S, T, pos) == ERROR)
{
cout << "位置輸入不合法或者不匹配!" << endl;
}
else
{
cout << "第一個匹配的位置爲:" << Strindex(S, T, pos) << endl;
}
break;
case 0:
cout << "操作結束!" << endl;
break;
default:
cout << "輸入錯誤!" << endl;
}
} while (select != 0);
ClearString(S);
ClearString(Sub);
ClearString(S1);
ClearString(S2);
return 0;
}