为什么删除之后再进行插入和删除会出现错误
找到了出现问题的地方了,在出现在StrInsert(插入)和DelStr(删除)这两个函数中的free语句中,如果一直插入的话不会有问题,但如果删除之后再进入插入和删除的话程序就在free语句处出错了,求高手解惑啊,能在不删除两个free语句的情况下解决这个问题.
#include "stdio.h"
#include "malloc.h"
typedef struct
{
char *ch;
int len;
}SString;
int InitString(SString *s)
{
s->ch=NULL;
s->len=0;
}
int StrAssign(SString *s,char *tval)
{
int len,i=0;
if(s->ch!=NULL) free(s->ch);
while(tval[i]!='\0') i++;
len=i;
s->len=i;
if(len)
{
s->ch=(char *)malloc(len);
if(s->ch==NULL) return 0;
for(i=0;i<len;i++) s->ch[i]=tval[i];
}
else s->ch=NULL;
return 1;
}
int StrInsert(SString *s,int pos,SString *t)
{
int i;
char *temp;
if(pos<0||pos>s->len||s->len==0) return 0;
temp=(char *)malloc(s->len+t->len);
if(temp==NULL) return 0;
for(i=0;i<pos;i++) temp[i]=s->ch[i];
for(i=0;i<t->len;i++) temp[pos +i]=t->ch[i];
for(i=pos;i<s->len+t->len;i++) temp[i+t->len]=s->ch[i];
free(s->ch);
s->len+=t->len;
s->ch=temp;
return 1;
}
int DelStr(SString *s,int pos,int len)
{
int i;
char *temp;
if(pos<0||pos +len>s->len) return 0;
for(i=0;i<pos;i++) temp[i]=s->ch[i];
for(i=pos;i<s->len-len;i++) temp[i]=s->ch[i+len];
s->len-=len;
free(s->ch);
s->ch=temp;
return 1;
}
int StrCopy(SString *s,SString *t) //将串t赋值到串s中
{
int i;
s->ch=(char *)malloc(t->len);
if(s->ch==NULL) return 0;
for(i=0;i<t->len;i++) s->ch[i]=t->ch[i];
s->len=t->len;
return 1;
}
void prt(SString *s)
{
int i;
for(i=0;i<s->len;i++) putch(s->ch[i]);
}
void main()
{
char ch[100];
int pos,i,len;
SString s,t;
InitString(&s);
printf("请输入要插入字符串:");
scanf("%s",ch);
StrAssign(&s,ch);
do
{
system("cls");
printf("\t\t\t1、插入\n\t\t\t2、删除\n\t\t\t0、退出\n\t\t\t请选择:");
do
{
scanf("%d",&i);
}while(!(i>=0&&i<3));
system("cls");
switch(i)
{
case 1:
{
printf("当前串为:");
prt(&s);
printf("\n共%d个字符\n你要从第几个字符之前插入:",s.len);
do
{
scanf("%d",&pos);
}while(!(pos>0&&pos<=s.len));
pos--;
printf("请输入要插入的字符串:");
scanf("%s",ch);
InitString(&t);
StrAssign(&t,ch);
StrInsert(&s,pos,&t);
printf("插入之后的字符串是:");
prt(&s);
printf("\n");
system("pause");
break;
}
case 2:
{
printf("当前串为:");
prt(&s);
printf("\n共%d个字符\n你要从第几个字符开始删除:",s.len);
do
{
scanf("%d",&pos);
}while(!(pos>0&&pos<=s.len));
pos--;
printf("请输入要删除字符的个数:");
do
{
scanf("%d",&len);
}while(!(pos+len<=s.len&&len>0));
InitString(&t);
StrAssign(&t,ch);
DelStr(&s,pos,len);
printf("删除之后的串是:");
prt(&s);
printf("\n");
system("pause");
break;
}
}
}while(i);
}
[ 本帖最后由 mfkvfhpdx 于 2011-10-16 14:55 编辑 ]