来源:互联网 发布:什么软件字体好看 编辑:程序博客网 时间:2024/04/30 12:11


/////////////////串用数组表示的基本操作--------S[0]存放字符串中的字符个数,字符串的起始地址是S+1____谨记/////////////////
#include<stdio.h>
#include"stdlib.h"
#include<string.h>
#define MASIZED 255
#define ERROR 0
typedef unsigned char SString[MASIZED+1];

void SString0_value(SString S){// 将当前字符数组中的元素个数,放到,该数组的S[0]中
 int m;
 for(m=1;S[m] != '\0';m++);
 S[0]=m-1;
 S[S[0]+1]='\0';
 printf("successfull!!: %d\n",S[0]);
}

void in_a_SString(SString S,int n,char a){//向字符串的第n个位置插入单个字符,每次插入一个字符,s[0]就会自动增1
 int i;                                         
 SString0_value(S);
// printf("%d\n",S[0]);

 for(i=S[0];i>=n;i--)
 S[i+1]=S[i];
 
 S[n]=a;
 S[S[0]+2]='\0';
 S[0]++;
 printf("in  successful!!!\n");
}


//遍历字符串
void bianli_SString(SString  S ){  
 printf("%s\n",S+1);
 
}

//向串中的第n个位置插入s1串

void in_S1_n_SString(SString S,int n,SString S1){
 int i,l,t;
 l=strlen(S1);//测出S1的长度
 SString0_value(S);
 printf("%d\n",l);
 for(i=S[0];i>=n;i--)
  S[i+l]=S[i];
 i=0,t=0;

 while(S1[t++] != '\0'){//while(l--)也行 
 S[n++]=S1[i++];
 S[0]++;
 }
 S[S[0]+1]='\0';
 printf("S[0]= %d\n",S[0]);
}

//清空字符串
void clear_SString(SString S){
 S[1]='\0';
 S[0]=0;
 printf("clear successfull!!!\n");

}

//比较两个字符串,相等返回0,前者大于后者返回1,后者大于前者返回-1
int compare_SString(SString S,SString S1){
 int l=strlen(S1),i=1,j=0,n=1,m=0;
 SString0_value(S);//此处是将从S+1开始的s串中的字符个数,赋值给S[0]

 while(S[i++] !='\0' && S1[j++] != '\0'){
 if(S[n++] > S1[m++]) return 1;
 else if(S[n++] < S1[m++]) return -1;
 }
 printf("%d,%d\n",S[0],l);
 if(S[0] != l) {printf("to here !!\n");return 1;}//说明S长
 else return 0;
}


//复制s1至s中,长度是以s为准,不会增减
void copy_S1_SString(SString S,SString S1){
 int i=1,j=1;
 SString0_value(S);
 SString0_value(S1);
 while(S[i++] != '\0' && S1[j++] !='\0'){
  S[i-1]=S1[j-1]; 
 }

}
//将s1的字符串,复制到S中,如果,s1长则,需要将S增长
void  Copy_S1_S_SString(SString S,SString S1){
 int i=1,j=1,n,m;
 SString0_value(S);
 SString0_value(S1);
 while(S[i++] != '\0' && S1[j++] !='\0'){
  S[i-1]=S1[j-1]; 
 }
 n=i-1;m=j-1;
 if(m<S1[0]) {
  while(S1[j++] != '\0'){
   printf("j is : %d.....i is :%d\n",j,i);
   S[i-1]=S1[j-1];i++;S[0]++;
   //printf("to here!!\n");
  }
  S[S[0]+1]='\0';
 
 }
 printf("S is :%d\n",S[0]);


}

 

//将s和s1这两个字符串链接在一起
void contact_SStirng(SString T,SString S,SString S1){
 int i=1,m,q;

 SString0_value(S);
 SString0_value(S1);
 m=S1[0];q=S[0];
 
 if(S[0]+S1[0] <= MASIZED ){
  Copy_S1_S_SString(T,S);
  printf("T[0] IS:%d\n",m);
  while(m--){
   T[++q]=S1[i++];
  }
  T[q+1]='\0';
  }
}

//查找在S中和S1相同的串,并返回,是第几个元素开始相同

int search_S1_SString(SString S,SString S1){
 int i,j,n=1,t;
 SString0_value(S);
 SString0_value(S1);

 for(i=1;i<=S[0]-S1[0]+1;i++){
    j=i;t=j;
    while(S1[n++] != '\0'){
     if(S[j++] != S1[n-1]) {  
      n=1;
      break;
   }//if  
    }//while
  if((n-2)== S1[0])
   { 
   printf("find it\n");
   return t;
   }//if
 //printf("to here!!\n");
 }//for
  
   
 return ERROR;
}//search


//用sub串返回,字符串中从第pos个位置起,长度为len的字符串
void back_sub_SString(SString sub,SString S,int pos,int len){
 int i=1;
 //SString0_value(sub);//这里注意,为什么,这里sub[0]是9,纳闷????????????????????
 //sub[0]=0;
 //sub[1]='\0';
 clear_SString(sub);
 SString0_value(S);

 if(1<=pos<=S[0] && 0<=len<=S[0]-pos+1){
  while(len--){
   sub[i++]=S[pos++];sub[0]++;
  }
  sub[sub[0]+1]='\0';

 }//if

 else printf("error!!\n");

 //printf("%d.......\n",sub[0]);

}//back

//用v替代,s中存在的t串,这里该v串同t串长度相等
int  represent_V_T_SString(SString S,SString T,SString V){
 int i,t=1;
 i=search_S1_SString(S,T);
 SString0_value(V);/////////////
 printf("%d..........\n",V[0]);
 if(i==0) return ERROR; 
 while(V[t++] != '\0'){
 S[i++]=V[t-1];
 }
 return 1;
}


int main(){
 //SString S,S1,T;
 SString S,T,V;
 //int n;
 //char *S1;
 printf("input the S: ");
 scanf("%s",S+1);

 printf("input the T: ");
 scanf("%s",T+1);

 printf("input the S: ");
 scanf("%s",V+1);
 
 
 //printf("input the S1: ");
 //scanf("%s",S1+1);
 //向字符串中的第n个位置插入字符串S1
 //in_S1_n_SString(S,n,S1);
 //向字符串中的第n个位置插入字符A
 //in_a_SString(S,n,'A');
 //复制s1至s,s的长度不会改变
 //copy_S1_SString(S,S1);
 //s1复制到s中,若s1长于s那么,以s1为准,即增加s的长度,使得s可以容下s1
 //Copy_S1_S_SString(S,S1);
 
 ////////////////////////////////////////////////////////////////////////////////////////
 //寻找字符串s中的与字符串相等的起始角标,当输出n为0时表示s中没有子串s1
 //n=search_S1_SString(S,S1);
 //printf(" 0 is error:%d\n",n);
 ////////////////////////////////////////////////////////////////////////////////////////
 
 //将s和s1链接在t中
 //contact_SStirng(T,S,S1);
 //遍历字符串
 //bianli_SString(T);
 //比较两个字符串的大小(注意S的S[0]是存放其长度的,实际串是从S+1开始的)(而S1,串的起始地址是S1)//若自己用着不舒服可以简单的修该一下
 //printf("the ansew is :%d\n",compare_SString(S,S1));

 //用sub串返回,字符串中从第pos个位置起,长度为len的字符串
 //back_sub_SString(sub,S,4,3);
 //bianli_SString(sub);

 represent_V_T_SString(S,T,V);
 bianli_SString(S);

 //清空字符串后,S[0]为0,S[1]='\0'
 //clear_SString(sub);
 return 0;

}