#include
#define MAXSIZE 100
typedef struct
{
char ch[MAXSIZE];
int Len;
}String;
int StrLength(String *S)
{
int i = 0;
while(S->ch[i]!=' '){
i++;
}
S->Len = i;
return (S->Len);
}
void CreatStr(String *S)
{
gets(S->ch);
S->Len = StrLength(S);
}
int SubString(String *S , String *Sub , int pos , int len)
{
int j;
if(pos < 1 || pos>S->Len || len < 1 || len>S->Len-pos+1){
Sub->Len = 0;
printf("参数错误!n");
return 0;
}else{
for(j = 0 ; j < len ; j++){
Sub->ch[j] = S->ch[pos+j-1];
}
Sub->ch[j] = ' ';
Sub->Len = len;
return 1;
}
}
int StrDelete(String *S , int i , int l)
{
int k;
if(i+l-1>S->Len){
printf("要删除的子串越界!n");
return 0;
}else{
for(k = i+l-1 ; k < S->Len;k++,i++){
S->ch[i-1]= S->ch[k];
}
S->Len = S->Len-l;
S->ch[S->Len]= ' ';
return 1;
}
}
int StrInsert(String *S , String *S1 , int i)
{
int k;
if(i>S->Len+1){
printf("插入的位置错误!n");
return 0;
}else if(S->Len+S1->Len>MAXSIZE){
printf("两串长度超过存储空间长度!n");
return 0;
}else{
for(k = S->Len-1 ; k >= i-1 ; k--){
S->ch[S1->Len+k] = S->ch[k];
}
for(k = 0; k < S1->Len;k++){
S->ch[i+k-1] = S1->ch[k];
}
S->Len = S->Len+S1->Len;
S->ch[S->Len] = ' ';
return 1;
}
}
int StrIndex(String *S , String *T)
{
int i = 0,j=0,k;
while(iLen && jLen){
if(S->ch[i]==T->ch[j]){
i++;
j++;
}else{
i = i-j+1;
j=0;
}
}
if(j>T->Len){
k = i-T->Len+1;
}else{
k=-1;
}
return k;
}
int Strcompare(String *S1 , String *S2)
{
int i=0,flag = 0;
while(S1->ch[i]!=' '&&S2->ch[i]!=' '){
if(S1->ch[i]!=S2->ch[i]){
flag =1;
break;
}else{
i++;
}
}
if(flag==0&&S1->Len==S2->Len){
return 0;
}else{
return S1->ch[i]-S2->ch[i];
}
}
int StrCat(String *S,String *T)
{
int i , flag;
if(S->Len+T->Len<=MAXSIZE){
for(i=S->Len;iLen+T->Len;i++){
S->ch[i] = T->ch[i-S->Len];
}
S->ch[i] = ' ';
S->Len += T->Len;
flag = 1;
}
else if(S->Len
for(i=S->Len;i
S->ch[i] = T->ch[i-S->Len];
}
S->Len = MAXSIZE;
flag = 0;
}else{
flag = 0;
}
return (flag);
}
void StrReplace(String *S , String *T,String *V)
{
int i,m,n,p,q;
n = S->Len;
m = T->Len;
q = V->Len;
p = 1;
do{
i = StrIndex(S,T);
if(i!=-1){
StrDelete(S,i,m);
StrInsert(S,V,i);
p=i+q;
S->Len=S->Len+q-m;
n=S->Len;
}
}while((p<=n-m+1)&&(i!=-1));
}
void Menu()
{
printf("==============n");
printf("t1.--建立新串并显示该串的长度n");
printf("t2.--求子串n");
printf("t3.--删除子串n");
printf("t4.--插入子串n");
printf("t5.--查找子串n");
printf("t6.--比较两个串的大小n");
printf("t7.--连接两个串n");
printf("t8.--子串替换n");
printf("t0.--返回n");
printf("==============n");
}
int main() {
String x , y , z;
String *S = &x, *S1 = &y , *T = &z;
int i , flag = 0 , len = 0;
char ch1 , ch2 , a;
ch1 = 'y';
while(ch1=='y' || ch1=='Y'){
Menu();
scanf("%c" , &ch2);
getchar();
switch (ch2) {
case '1':
printf("请输入一个字符串:");
CreatStr(S);
if(S->ch[0] == ' '){
printf("空串n");
}else {
printf("字符串的内容为:");
puts(S->ch);
printf("该串的长度为:%dn" , S->Len);
}
break;
case '2':
printf("请输入从第几个位置开始求子串:");
scanf("%d" , &i);
printf("请输入取出的子串长度值:");
scanf("%d" , &len);
flag = SubString (S, S1, i, len );
if(flag){
printf("求子串成功,原来主串为:n");
puts(S->ch);
printf("所得子中内容为:");
puts(S1->ch);
}else{
printf("求子串失败n");
}
break;
case '3':
printf("请输入要删除的子串的起始位置:");
scanf("%d" , &i);
printf("请输入要删除的子串的长度:");
scanf("%d" , &len);
printf("删除前的子串内容为:");
puts(S->ch);
flag = StrDelete(S, i, len);
if(flag){
printf("删除子串成功,删除后的新的串为:");
puts(S->ch);
}else {
printf("删除子串失败!n");
}
break;
case '4':
printf("请输入要插入子串在主串中的位置:");
scanf("%d" , &i);
printf("请输入子串");
getchar();
CreatStr(S1);
printf("插入前的字符串内容为:");
puts(S->ch);
flag = StrInsert(S , S1, i);
if(flag){
printf("插入子串成功!插入后的新的主串为:");
puts(S->ch);
}else{
printf("插入子串失败!n");
}
break;
case '5':
printf("请输入第一个字符串:");
CreatStr(S);
printf("请输入第二个字符串:");
CreatStr(S1);
flag = StrIndex(S , S1);
if(flag == -1){
printf("查找失败,主串中不有该子串n");
}else {
printf("查找成功,该子串在主串中第一次出现的位置为%dn" , flag);
}
break;
case '6':
printf("请输入第一个字符串:");
CreatStr(S);
printf("请输入第二个字符串:");
CreatStr(S1);
flag = Strcompare(S , S1);
if(flag>0){
printf("第一个字符串大n");
}else if(flag < 0){
printf("第二个字符串大n");
}else{
printf("两个字符串相等n");
}
break;
case '7':
printf("请输入第一个字符串:");
CreatStr(S);
printf("请输入第二个字符串:");
CreatStr(S1);
flag = StrCat(S, S1);
if(flag ){
printf("连接以后的新串值为:n" );
puts(S->ch);
}else{
printf("连接失败!n");
}
break;
case '8':
printf("请输入主串:");
CreatStr(S);
printf("请输入在主串查找的子串:");
CreatStr(S1);
printf("请输入要替换的子串");
CreatStr(T);
printf("替换前的主串内容为:");
puts(S->ch);
StrReplace(S , S1 , T);
printf("替换后的主串内容为:");
puts(S->ch);
break;
case '0':
ch1 = 'n';
break;
default:
printf("输入有误,请输入0-9进行选择!");
}
if(ch2 != '0'){
printf("n按回车键继续,按任意键返回主菜单!n");
a = getchar();
if(a != 'xA'){
getchar();
ch1 = 'n';
}
}
}
}