數據結構的字符串操作,本人寫了八個,有一個替換操作基於這個程序的問題,沒寫出來,有點水,呵呵,大家給點意見哦
下面是代碼:
#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);
}
希望各位不吝賜教,有空幫小弟把替換函數補一下,不勝感激!!!!