本程序编写了一个字符串并实现了字符串的一些基本操作(字符串建立、获取串长度、子串查找、两串比较大小、字符串连接等等)。
本程序字符串使用结构体类型创建,使用malloc()函数实现数组扩容。
#include#include #define MAXLEN 100 //定义常量最大长度 //定义字符串结构体 struct String{ char *str; int length; }; //函数声明 void CreatStr(String *); int StrLength(String *); void printString(String *); String *Substring(String *,int ,int ); String *StrDelete(String *,int ,int ); String *StrInsert(String *,String *,int ,int ); void processStrInsert(String *); void processStrDelete(String *); int StrIndex(String *, String *); void processStrIndex(String *); int StrCompare(String *, String *); void processStrCompare(); void StrCat(String *); void StrReplace(String *); void replaceSubstring(String *,String *,String *,int); void menu(); //建立新串函数 void CreatStr(String *string){ //动态分配内存空间,解决数组空间固定问题 string->str = (char *)malloc(MAXLEN); gets(string->str); string->length = StrLength(string); } //返回串长函数 int StrLength(String *string){ int i = 0; while(string->str[i] != ' ') i++; return i; } //输入输出串及串长 void printString(String *string){ printf("输入字符串:n"); CreatStr(string); printf("n字符串为:n"); puts(string->str); printf("该字符串串长为:%dn",string->length); } //返回子串函数 String *Substring(String *string,int index,int length){ if(index<1 || index>string->length || length<1 || length>string->length-index+1) return NULL; //判断获取的子串的下标及长度是否符合 String *substring = (String *)malloc(sizeof(String)); //动态分配一个String大小的空间 substring->str = (char *)malloc(length + 5); //对数组动态分配一个length+5大小的空间 int i; for(i = 0; i < length; i++) //依次将原串指定下标到长度的值赋给子串 substring->str[i] = string->str[index+i-1]; substring->str[i] = ' '; //子串加上字符串结束符,防止出现错误 substring->length = length; //子串长度赋值 return substring; } //处理子串函数 void processSubstring(String *string){ String *substring; int index,length; printf("输入子串的下标及长度:"); scanf("%d%d",&index,&length); substring = Substring(string,index,length); if(substring == NULL) printf("求子串失败,子串范围应为1~%dn",string->length); else{ printf("子串获取成功,子串为:n"); puts(substring->str); } getchar(); //吸收换行符,防止运行时自动跳过下文 } //删除子串 String *StrDelete(String *string,int index,int length){ if(index<1 || index > string->length || index+length-1>string->length) return NULL; String *substring = (String *)malloc(sizeof(String)); substring->str = (char *)malloc(length + 5); int i,j; for(i = 0; i < length; i++) //获取将要删除的子串 substring->str[i] = string->str[index+i-1]; substring->str[i] = ' '; substring->length = length; for(i = index+length-1,j = index-1; i length; i++,j++) string->str[j] = string->str[i]; //删除子串 string->length -= length; string->str[string->length] = ' '; return substring; //返回子串 } //处理子串删除函数 void processStrDelete(String *string){ int index,length; printf("输出要删除的子串的下标及长度: "); scanf("%d%d",&index,&length); String *substring = StrDelete(string,index,length); if(substring == NULL) printf("删除子串失败n"); else{ printf("删除子串成功,原串为:n"); puts(string->str); printf("n删除的子串为:n"); puts(substring->str); } getchar(); //吸收换行符 } //子串插入 String *StrInsert(String *string,String *substring,int index,int length){ int i; if(index<1 || index>string->length+1) return NULL; for(i = string->length-1; i>=index-1; i--) //原串| 串长-1~下标-1 |依次后移 string->str[i+substring->length] = string->str[i]; for(i = 0; i length; i++) //插入子串 string->str[i+index-1] = substring->str[i]; string->length += substring->length; string->str[string->length] = ' '; return string; } //处理子串插入函数 void processStrInsert(String *string){ String *substring = (String *)malloc(sizeof(String)); int index; printf("输入要插入的子串:n"); CreatStr(substring); //substring的数组空间在创建串函数中已被分配 printf("输入要插入的字符串下标:"); scanf("%d",&index); substring = StrInsert(string,substring,index,substring->length); if(substring == NULL) printf("子串插入失败,插入范围应为1~%dn",string->length+1); else{ printf("插入子串成功,新的串为:n"); puts(string->str); } getchar(); //吸收换行符 } //返回子串第一次出现的第一个字符的下标 int StrIndex(String *string, String *substring){ int i,j; i = j = 0; while(i length && j length) if(string->str[i] == substring->str[j]){ i++; //如果原串中有子串,变量i、j自加 j++; }else{ //否则i从自己的下个字符开始判断,j重新置0 i = i - j + 1; j = 0; } if(j >= substring->length) //j大于或等于子串长度说明原串中有子串 return i - substring->length +1; else return -1; } //处理子串查找函数 void processStrIndex(String *string){ String *substring = (String *)malloc(sizeof(String)); int flag; printf("输出要查找的子串:n"); CreatStr(substring); flag = StrIndex(string,substring); if(flag == -1) printf("查无此串n"); else printf("查找子串成功,子串下标为:%dn",flag); } //字符串比较 int StrCompare(String *string1, String *string2){ int i,j; i = j = 0; while(i length && j length){ if(string1->str[i] != string2->str[j]) break; //如果两串中有字符不相同,立即终止循环 i++; j++; } //如果j等于串长度且两串长度相同,两串相等 if(j==string2->length && string1->length==string2->length) return 0; else return string1->str[i] - string2->str[j]; } //处理字符串比较函数 void processStrCompare(){ String *string1 = (String *)malloc(sizeof(String)); String *string2 = (String *)malloc(sizeof(String)); int flag; printf("输入第一个字符串:n"); CreatStr(string1); printf("输入第二个字符串:n"); CreatStr(string2); flag = StrCompare(string1,string2); if(flag == 0) printf("n%s 与 %s 相等n",string1->str,string2->str); else if(flag > 0) printf("n%s 大于 %sn",string1->str,string2->str); else printf("n%s 小于 %sn",string1->str,string2->str); getchar(); //吸收换行符 } //字符串连接 void StrCat(String *frontString){ String *rearString = (String *)malloc(sizeof(String)); int i; printf("输入字符串:n"); CreatStr(rearString); //如果两串长度相加后大于最大长度(MAXLEN),数组扩容 if(frontString->length + rearString->length >= MAXLEN){ char *s = frontString->str; //把原串数组的引用赋给字符指针s frontString->str = (char *)malloc(MAXLEN + (int)(MAXLEN * 1.5)); //原串数组分配最大长度1.5倍的空间 for(i = 0; i < frontString->length; i++) frontString->str[i] = s[i]; //将原串的数据赋给新数组空间 frontString->str[i] = ' '; free(s); //释放原数组空间 } for(i = 0; i < rearString->length; i++) //进行两串连接操作 frontString->str[i+frontString->length] = rearString->str[i]; frontString->length += rearString->length; frontString->str[frontString->length] = ' '; printf("新字符串为:n"); puts(frontString->str); getchar(); //吸收换行符 } //处理子串替换函数 void StrReplace(String *string){ String *sourceSubtring = (String *)malloc(sizeof(String)); String *targetSubstring = (String *)malloc(sizeof(String)); int tag; printf("输入要替换的原子串:n"); CreatStr(sourceSubtring); printf("输入目标串:n"); CreatStr(targetSubstring); tag = StrIndex(string,sourceSubtring); if(tag == -1) //判断是否有输入的子串 printf("无原子串n"); else{ //否则,调用子串替换函数 replaceSubstring(string,sourceSubtring,targetSubstring,tag); printf("子串替换成功,新串为:n"); puts(string->str); } getchar(); } //子串替换 void replaceSubstring(String *string,String *source,String *target,int tag){ if(tag == -1) //如果不存在要替换的子串,结束递归 return; else{ StrDelete(string,tag,source->length); //执行原子串删除操作 StrInsert(string,target,tag,target->length);//执行新子串插入操作 tag = StrIndex(string,source); //查找字符串中的下一个原子串 replaceSubstring(string,source,target,tag); //递归调用本函数 } } //显示菜单 void menu(){ printf("n 串子系统"); printf("n=============================================="); printf("n| 1--建立新串并显示该串及长度 |"); printf("n| 2--求子串 |"); printf("n| 3--删除子串 |"); printf("n| 4--插入子串 |"); printf("n| 5--查找子串 |"); printf("n| 6--比较两个串大小 |"); printf("n| 7--连接两个串 |"); printf("n| 8--子串替换 |"); printf("n| 0--返回 |"); printf("n=============================================="); printf("n请输入菜单号(0-8):"); } void main(){ String x; String *string; char ch1,ch2 = 'y'; string = &x; do{ menu(); scanf("%c",&ch1); getchar(); switch(ch1){ case '1':printString(string);break; case '2':processSubstring(string);break; case '3':processStrDelete(string);break; case '4':processStrInsert(string);break; case '5':processStrIndex(string);break; case '6':processStrCompare();break; case '7':StrCat(string);break; case '8':StrReplace(string);break; case '0': ch2 = 'n';break; } if(ch1 != '0'){ printf("按回车键继续,按任意键退出"); ch1 = getchar(); if(ch1 != 'n'){ getchar(); ch2 = 'n'; } } }while(ch2=='y' || ch2=='Y'); printf("n本次操作结束,"); system("pause");//输出运行时程序末尾的中文翻译 }



