数据结构的字符串操作,本人写了八个,有一个替换操作基于这个程序的问题,没写出来,有点水,呵呵,大家给点意见哦
下面是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
typedef struct{
char *ch;
int length;
}HString;
//自定义的函数
int strlength(HString l);
void strAssign(HString m,HString n);
void strConcat(HString u,HString v);
void Substr(HString x,int i,int j);
int Strcmp(HString x,HString y);
int index(HString x,HString y,int i);
void strinsert(HString s,int i,HString t);
void StrDelete(HString s,int i,int len);
int main()
{
system("color e4");
HString L,P,R;
char *l,*p,*r;
int n,m,o;
int x,y;
l = L.ch = (char *)malloc(sizeof(char));
p = P.ch = (char *)malloc(sizeof(char));
r = R.ch = (char *)malloc(sizeof(char));
printf("请选择你的操作(1~9)进行操作,输入0结束:\n");
printf(" ----------1.求串长----------\n");
printf(" ----------2.串赋值----------\n");
printf(" ----------3.串连接----------\n");
printf(" ----------4.求子串----------\n");
printf(" ----------5.串比较----------\n");
printf(" ---------6.子串定位----------\n");
printf(" ----------7.串插入----------\n");
printf(" ----------8.串删除----------\n");
printf(" ----------9.串替换----------\n");
while(scanf("%d",&n))
{
if(n == 0)
{
printf("Error\n");
break;
}
switch(n)
{
case 1:{
getchar();
printf("输入字符串:\n");
gets(l);//读入字符串
printf("串长:%d\n",strlength(L));//调用函数,返回字符串的长度
break;
}
case 2:{
printf("输入第一个字符串:");
getchar();
gets(l);
printf("第二个:");
gets(r);
strAssign(L,R);
break;
}
case 3:{
printf("输入第一个字符串:");
getchar();
gets(l);
printf("第二个:");
gets(r);
strConcat(L,R);
break;
}
case 4:{
getchar();
printf("输入字符串:\n");
gets(l);//读入字符串
printf("输入要求的子串:");
scanf("%d%d",&x,&y);
Substr(L,x,y);
break;
}
case 5:{
printf("输入第一个字符串:");
getchar();
gets(l);
printf("第二个:");
gets(r);
printf("结果是:%d\n",Strcmp(L,R));
break;
}
case 6:{
printf("输入第一个字符串:");
getchar();
gets(l);
printf("第二个:");
gets(r);
printf("输入要返回的位置:");
scanf("%d",&o);
printf("结果是:%d\n",index(L,R,o));
break;
}
case 7:{
printf("输入第一个字符串:");
getchar();
gets(l);
printf("第二个:");
gets(r);
printf("输入你要插入的位置:");
scanf("%d",&m);
strinsert(L,m,R);
puts(L.ch);
break;
}
case 8:{
getchar();
printf("输入字符串:\n");
gets(l);//读入字符串
printf("输入要删除的编号:");
scanf("%d%d",&m,&n);
StrDelete(L,m,n);
break;
}
}
}
system("pause");
return 0;
}
int strlength(HString l)
{
return strlen(l.ch);
}
void strAssign(HString m,HString n)//串赋值函数 2
{
if(strlen(n.ch) > m.length){
free(m.ch);
m.ch = (char *)realloc(m.ch,3 * m.length);
}
strcpy(m.ch,n.ch);
printf("赋值操作: ");
printf("第一个串被改为:");
puts(m.ch);
}
void strConcat(HString u,HString v)//串连接函数 3
{
if(u.length < (strlen(u.ch) + strlen(v.ch) + 2)){//第一个串的总内存不够使用,则重新申请
free(u.ch);
u.ch = (char *)realloc(u.ch,(u.length + v.length + 4));
}
strcat(u.ch,v.ch);
printf("串连接操作:");
puts(u.ch);
}
void Substr(HString x,int i,int j)//求字串函数 4
{
int w;
if(i < 0 || j < 0 || i > strlen(x.ch) || j > (strlen(x.ch)))
printf("Error\n");
for(w = i; w <= j; w++)
printf("%c",x.ch[w]);
}
int Strcmp(HString x,HString y)//串比较函数,若前者等于后者,返回0;若大于,返回正整数,若小于,返回负整数。5
{
return strcmp(x.ch,y.ch);
}
int index(HString s,HString t,int i)
{
int x,y;
x = i;
y = 0;
while(s.ch[x + y] != '\0' && t.ch[y] != '\0')
{
if(s.ch[x + y] == t.ch[y])
y++;
else
{
x++;
y = 0;
}
}
if(t.ch[y] == '\0')
return x;
else
return -1;
}
void strinsert(HString s,int i,HString t)//经历好久终于攻破!!!!吐血啊
{
int x,y,L1,L2;
L1 = strlen(s.ch);
L2 = strlen(t.ch);
for(x = L1 - 1;x >= i - 1;x--)
s.ch[x + L2] = s.ch[x];
s.ch[L1 + L2] = '\0';
for(x = i - 1,y = 0; y < L2; x++,y++)
s.ch[x] = t.ch[y];
}
void StrDelete(HString s,int i,int len)//算法是,把要保留的存入一个数组中,把要求删除的舍弃,输出新串即可
{
char ch[100];
int x,y,z;
for(x = 0,y = 0; x < i; x++,y++)
ch[y] = s.ch[x];
z = strlen(ch);
for(x = len + 1,y = z; s.ch[x] != '\0'; x++,y++)
ch[y] = s.ch[x];
ch[strlen(s.ch) - len + i - 1] = '\0';
puts(ch);
}
希望各位不吝赐教,有空帮小弟把替换函数补一下,不胜感激!!!!