1
//定长顺序存储
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 255
#define OK 1
#define ERROR -1
#define TRUE 1
#define FALSE -1
typedef int Status;
typedef unsigned char SString[MAXSIZE+1];;
void StrAssign(SString s,char *ch);
int StrLength(SString s);
int StrCompare(SString s,SString t);
Status StrClear(SString s);
Status StrConcat(SString s,SString s1,SString s2);
void Display(SString s);
int main(void){
SString str1,str2 ,str3;
StrAssign(str1,"abmd");
printf("第一个字符串为:");
Display(str1);
StrAssign(str2,"abcde");
printf("第二个字符串为:");
Display(str2);
printf("比较串的大小:0代表相等,-1代表第一个串比第二个串大,1代表第一个串比第二个串小\n");
printf("s1:");Display(str1);printf("s2:");Display(str2);
printf("S串与T串:%d\n", StrCompare(str1, str2));
StrConcat(str3,str1,str2);
printf("s1与s2连接后的新字符串为");
Display(str3);
return 0;
}
void StrAssign(SString s,char *ch){
int i=0,j;
while(ch[i]!='\0')
i++;
if(i==0)
s[0]=0;
else{
s[0]=i;
for(j=0;j<i;j++)
s[j+1]=ch[j];
}
}
int StrLength(SString s){
return s[0];
}
int StrCompare(SString s,SString t){
int i;
for(i=1;i<s[0]&&i<t[0];i++){
if(s[i]<t[i])
return -1;
else if(s[i]>t[i])
return 1;
}
if(s[0]-t[0]<0)
return -1;
else if(s[0]-t[0]>0)
return 1;
else
return 0;
}
Status StrClear(SString s){
s[0]=0;
return OK;
}
Status StrConcat(SString s,SString s1,SString s2){
int i,j;
s[0]=s1[0]+s2[0];
if(s[0]>MAXSIZE)
s[0]=MAXSIZE;
for(i=1;i<=s1[0];i++)
s[i]=s1[i];
i=s1[0];
for(j=1;j<=s2[0]&&i+j<=MAXSIZE;j++)
s[i+j]=s2[j];
return OK;
}
void Display(SString s){
for(int i=1;i<=s[0];i++){
printf("%c",s[i]);
}
printf("\n");
}
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct SString{
char ch[MAXSIZE+1];
int length;
}SString;
void StrAssign(SString *s,char chs[]);
void StrCopy(SString *s1,SString *s2);
int StrLength(SString *s);
int StrCompare(SString *s1,SString *s2);
void StrClear(SString *s);
void StrConcat(SString *s,SString *s1,SString *s2);
void SubString(SString *sub,SString *s,int pos,int len);
void StrInsert(SString *s1,int pos,SString *s2);
int Replace(SString *s,SString *t,SString *v,int pos);
void Replace_ALL(SString *s,SString *t,SString *v);
int Index(SString *s,SString *t,int pos);
void StrDelete(SString *s,int pos,int len);
void Display(SString s);
int main(void){
SString s1,s2,s3;SString t;
StrAssign(&s1,"abcabcabc");StrAssign(&t,"bc");
Display(s1);Display(t);
printf("s1串长度为:%d\n",StrLength(&s1));
StrCopy(&s2,&s1);
StrConcat(&s3,&s1,&t);
StrInsert(&s1,2,&t);
StrDelete(&s1,3,3);
printf("比较串的大小:0代表相等,-1代表第一个串比第二个串大,1代表第一个串比第二个串小\n");
printf("s1:");Display(s1);printf("s2:");Display(s2);
printf("S串与T串:%d\n", StrCompare(&s1, &s2));
return 0;
}
void StrAssign(SString *s,char chs[]){
int i=0;
while(chs[i]!='\0'){
s->ch[i]=chs[i];
i++;
}
s->length=i;
}
void StrCopy(SString *s1,SString *s2){
for(int i=0;i<s2->length;i++){
s1->ch[i]=s2->ch[i];
}
s1->length=s2->length;
printf("复制后新串为:");
Display(*s1);
}
int StrLength(SString *s){
return s->length;
}
int StrCompare(SString *s1,SString *s2){
int i=0;
while(i<s1->length&&i<s2->length){
if((int)s1->ch[i]>(int)s2->ch[i])
return 1;
else if((int)s1->ch[i]<(int)s2->ch[i])
return -1;
else {
++i;continue;
}
++i;
}
if(i==s1->length&&i!=s2->length)
return -1;
else if(i==s2->length&&i!=s1->length)
return 1;
else
return 0;
}
void StrClear(SString *s){
s->length=0;
}
void StrConcat(SString *s,SString *s1,SString *s2){
for(int i=0;i<s1->length;i++){
s->ch[i]=s1->ch[i];
}
s->length=s1->length;
for(int i=0;i<s2->length;i++){
s->ch[s->length++]=s2->ch[i];
}
printf("新串结果为:");
Display(*s);
}
void SubString(SString *sub,SString *s,int pos,int len){//返回子串
if(pos<1||pos>s->length||len<0||len>s->length-pos+1)
printf("子串输入有误\n");
for(int i=0;i<len;i++){
sub->ch[i]=s->ch[pos-1];
i++;pos++;
}
sub->length=len;
}
void StrInsert(SString *s1,int pos,SString *s2){//s1的pos位置插入s2
if(pos<1||pos>s1->length)
printf("插入有误\n");
for(int i=s1->length;i>=pos-1;i--){
s1->ch[i+s2->length]=s1->ch[i];
}
for(int i=0,k=pos-1;i<s2->length;i++,k++){
s1->ch[k]=s2->ch[i];
}
s1->length+=s2->length;
printf("插入后的结果为:");
Display(*s1);
}
int Replace(SString *s,SString *t,SString *v,int pos){//用v替换从pos开始的第1个t
int index=Index(&s,&t,pos);
if(index<0)
return -1;
StrDelete(&s,index,t->length);
StrInsert(&s,index,&v);
return 1;
}
void Replace_ALL(SString *s,SString *t,SString *v){
while(Replace(&s,&t,&v,0));
return 1;
}
int Index(SString *s,SString *t,int pos){//模式匹配:返回t在s中第pos的字符之后的位置
if(pos<1||pos>s->length){
printf("匹配有误\n");return 0;
}
int i=pos,j=0;
while(i<=s->length&&j<=t->length){
if(s->ch[i-1]==t->ch[j]){
i++;j++;
}
else{
i=i-j+1;j=0;//退回到上次匹配的首地址
}
}
if(j==t->length)
return i-t->length;
else
return 0;
}
void StrDelete(SString *s,int pos,int len){
if(pos<1||pos>s->length-len+1){
printf("删除有误\n");
}
int i;
for(i=pos;i<=s->length;i++){
s->ch[i]=s->ch[i+len];
}
s->length-=len;
printf("删除后的结果为:");
Display(*s);
}
void Display(SString s){
for(int i=0;i<s.length;i++){
printf("%c",s.ch[i]);
}
printf("\n");
}