# include  <iostream> # define  MAX_SIZE  15 # define  OK  1 # define  ERROR  0 # define  TRUE  1 # define  FALSE  0 typedef  int  Status; 
typedef  char  ElemType; typedef  ElemType String[ MAX_SIZE +  1 ] ; 
Status StrAssign ( String T,  const  char *  chars) 
{ int  length =  strlen ( chars) ; if  ( length >  MAX_SIZE) return  ERROR; T[ 0 ]  =  ( char ) length; for  ( int  i =  1 ;  i <=  length;  i++ ) { T[ i]  =  chars[ i -  1 ] ; } return  OK; 
} 
Status StrCopy ( String T,  String S) 
{ for  ( int  i =  0 ;  i <=  S[ 0 ] ;  i++ ) { T[ i]  =  S[ i] ; } return  OK; 
} 
Status StrEmpty ( String T) 
{ return  T[ 0 ]  ==  0  ?  TRUE :  FALSE; 
} 
int  StrCompare ( String T,  String S) 
{ for  ( int  i =  1 ;  ( i <=  T[ 0 ] )  &&  ( i <=  T[ 0 ] ) ;  i++ ) { if  ( T[ i]  >  S[ i] ) return  1 ; else  if  ( T[ i]  <   S[ i] ) return  - 1 ; } if  ( T[ 0 ]  >  S[ 0 ] ) return  1 ; else  if  ( T[ 0 ]  <  S[ 0 ] ) return  - 1 ; else  if  ( T[ 0 ]  ==  S[ 0 ] ) return  0 ; 
} 
Status StrLength ( String T) 
{ return  ( int ) T[ 0 ] ; 
} 
Status ClearString ( String T) 
{ T[ 0 ]  =  0 ; return  OK; 
} 
Status Concat ( String T,  String S1,  String S2) 
{ if  ( ( ( int ) S1[ 0 ]  +  ( int ) S2[ 0 ] )  <=  MAX_SIZE) { T[ 0 ]  =  ( char ) ( ( int ) S1[ 0 ]  +  ( int ) S2[ 0 ] ) ; for  ( int  i =  1 ;  i <=  ( int ) S1[ 0 ] ;  i++ ) T[ i]  =  S1[ i] ; for  ( int  j =  1 ;  j <=  ( int ) S2[ 0 ] ;  j++ ) T[  j +  ( int ) S1[ 0 ]  ]  =  S2[ j] ; return  OK; } for  ( int  i =  1 ;  i <=  ( int ) S1[ 0 ] ;  i++ ) T[ i]  =  S1[ i] ; for  ( int  j =  1 ;  j <=  MAX_SIZE;  j++ ) T[ j +  ( int ) S1[ 0 ] ]  =  S2[ j] ; T[ 0 ]  =  MAX_SIZE; return  ERROR; 
} 
Status SubString ( String Sub,  String T,  int  pos,  int  len) 
{ if  ( ( len  <  1 )  ||  ( pos > ( int ) T[ 0 ] )  ||  ( pos  <  1 )  ||  len > ( int ) T[ 0 ]  -  pos +  1 ) return  ERROR; for  ( int  i =  1 ;  i <=  len;  i++ ) { Sub[ i]  =  T[ pos +  i -  1 ] ; } Sub[ 0 ]  =  ( char ) len; return  OK; 
} 
int  Index ( String T,  String S,  int  pos) 
{ if  ( ( S[ 0 ]  ==  0 )  ||  ( T[ 0 ]  ==  0 )  ||  ( S[ 0 ]  >  T[ 0 ] )  ||  ( pos <  0 )  || ( pos >  T[ 0 ] ) ) return  - 1 ; int  i =  pos; int  j =  1 ; while  ( i<= T[ 0 ]  &&  j <=  S[ 0 ] ) { if  ( T[ i]  ==  S[ j] ) { j++ ; i++ ; } else { i =  i -  j +  2 ; j =  1 ; } } if  ( j >  ( int ) S[ 0 ] ) return  i -  ( int ) S[ 0 ] ; return  - 1 ; 
} 
int  Index2 ( String T,  String S,  int  pos) 
{ if  ( ( S[ 0 ]  ==  0 )  ||  ( T[ 0 ]  ==  0 )  ||  ( S[ 0 ]  >  T[ 0 ] )  ||  ( pos <  0 )  ||  ( pos >  T[ 0 ] ) ) return  - 1 ; int  n =  StrLength ( T) ; int  m =  StrLength ( S) ; String sub; int  i =  1 ; while  ( i <=  n -  m +  1 ) { SubString ( sub,  T,  i,  m) ; if  ( StrCompare ( sub,  S)  ==  0 ) return  i; i++ ; } return  - 1 ; 
} 
Status StrInsert ( String T,  int  pos,  String S) 
{ if  ( pos< 1  ||  pos >  S[ 0 ]  +  1 ) return  ERROR; if  ( ( ( int ) S[ 0 ]  +  ( int ) T[ 0 ] )  >  MAX_SIZE) { for  ( int  i =  ( int ) T[ 0 ] ;  i >=  pos;  i-- ) { T[ MAX_SIZE+  i-  ( int ) T[ 0 ] ]  =  T[  i ] ; } for  ( int  i =  1 ;  i <=  MAX_SIZE -  ( int ) T[ 0 ] ;  i++ ) { T[ pos +  i -  1 ]  =  S[ i] ; } T[ 0 ]  =  MAX_SIZE; return  ERROR; } for  ( int  i =  ( int ) T[ 0 ] ;  i >=  pos;  i-- ) { T[  i + ( int ) S[ 0 ]  ] =  T[ i] ; } for  ( int  i =  1 ;  i <=  ( int ) S[ 0 ] ;  i++ ) { T[ pos +  i -  1 ]  =  S[ i] ; } T[ 0 ]  = ( char ) ( ( int ) T[ 0 ]  +  ( int ) S[ 0 ] ) ; return  OK; 
} 
Status StrDelete ( String T,  int  pos,  int  len) 
{ if  ( ( pos< 1 )  ||  ( pos >  T[ 0 ]  +  1 )  ||  ( len >  T[ 0 ]  -  pos +  1 )  ||  ( pos <  0 ) ) return  ERROR; for  ( int  i =  pos +  len;  i <=  T[ 0 ] ;  i++ ) { T[ i -  len]  =  T[ i] ; } T[ 0 ]  =  ( char ) ( ( int ) T[ 0 ]  -  len) ; return  OK; 
} 
Status Replace ( String T,  String S,  String V) 
{ if  ( StrEmpty ( S) ) return  ERROR; int  i =  1 ; while  (  i >  0 ) { i =  Index ( T,  S,  i) ; if  (  i>  0  ) { StrDelete ( T,  i,  StrLength ( S) ) ; StrInsert ( T,  i,  V) ; i +=  StrLength ( V) ; } } return  OK; 
} 
Status ShowString ( String T) 
{ if  ( StrLength ( T)  ==  0 ) return  ERROR; for  ( int  i =  1 ;  i <=  StrLength ( T) ;  i++ ) { printf ( "%c" ,  T[ i] ) ; } printf ( "\n\n" ) ; return  OK; 
} int  main ( ) 
{ String str,  strcopy,  strcat; StrAssign ( str,  "abcd" ) ; printf ( "长度:%d, 是否为空:%d(1:是 0:否)\n\n" ,  StrLength ( str) , StrEmpty ( str) ) ; printf ( "显示str:\n" ) ; ShowString ( str) ; StrCopy ( strcopy,  str) ; printf ( "复制str显示strcopy:\n" ) ; ShowString ( strcopy) ; StrAssign ( strcopy,  "efghijk" ) ; printf ( "重新显示strcopy:\n" ) ; ShowString ( strcopy) ; printf ( "比较str和strcopy是否相等:%d(0:相等)\n\n" ,  StrCompare ( str,  strcopy) ) ; printf ( "str拼接strcopy:\n" ) ; Concat ( strcat,  str,  strcopy) ; ShowString ( strcat) ; ClearString ( str) ; printf ( "清空重新显示str:\n" ) ; ShowString ( str) ; printf ( "长度:%d, 是否为空:%d(1:是 0:否)\n\n" ,  StrLength ( str) ,  StrEmpty ( str) ) ; SubString ( str,  strcat,  2 ,  3 ) ; printf ( "截取后重新显示str:\n" ) ; ShowString ( str) ; printf ( "长度:%d, 是否为空:%d(1:是 0:否)\n\n" ,  StrLength ( str) ,  StrEmpty ( str) ) ; StrDelete ( str,  1 ,  2 ) ; printf ( "删除重新显示str:\n" ) ; ShowString ( str) ; printf ( "长度:%d, 是否为空:%d(1:是 0:否)\n\n" ,  StrLength ( str) ,  StrEmpty ( str) ) ; StrInsert ( str,  2 ,  strcopy) ; printf ( "插入重新显示str:\n" ) ; ShowString ( str) ; printf ( "长度:%d, 是否为空:%d(1:是 0:否)\n\n" ,  StrLength ( str) ,  StrEmpty ( str) ) ; int  ind =  Index ( str,  strcopy,  1 ) ; printf ( "查找到了,位置为:%d\n" , ind) ; printf ( "strcat:\n" ) ; ShowString ( strcat) ; printf ( "strcopy:\n" ) ; ShowString ( strcopy) ; printf ( "str:\n" ) ; ShowString ( str) ; Replace ( strcat,  str,  strcopy) ; printf ( "替换重新显示strcat:\n" ) ; ShowString ( strcat) ; printf ( "长度:%d, 是否为空:%d(1:是 0:否)\n\n" ,  StrLength ( strcat) ,  StrEmpty ( strcat) ) ; printf ( "strcat插入一个更长的数:\n" ) ; String s; StrAssign ( s,  "123456" ) ; StrInsert ( strcat,  5 ,  s) ; printf ( "strcat:\n" ) ; ShowString ( strcat) ; printf ( "长度:%d, 是否为空:%d(1:是 0:否)\n\n" ,  StrLength ( strcat) ,  StrEmpty ( strcat) ) ; ClearString ( str) ; ClearString ( strcopy) ; ClearString ( strcat) ; printf ( "strcat:\n" ) ; ShowString ( strcat) ; printf ( "strcopy:\n" ) ; ShowString ( strcopy) ; printf ( "str:\n" ) ; ShowString ( str) ; return  0 ; 
}