| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 630 人关注过本帖
标题:为什么删除之后再进行插入和删除会出现错误
只看楼主 加入收藏
mfkvfhpdx
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-6-15
结帖率:0
收藏
 问题点数:0 回复次数:3 
为什么删除之后再进行插入和删除会出现错误
找到了出现问题的地方了,在出现在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 编辑 ]
搜索更多相关主题的帖子: include 
2011-10-16 00:00
mfkvfhpdx
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-6-15
收藏
得分:0 
发了好久了,求高手
2011-10-28 23:47
caikun1986
Rank: 2
等 级:论坛游民
帖 子:4
专家分:13
注 册:2010-11-25
收藏
得分:0 
1)先说说插入函数
    for(i=pos;i<s->len+t->len;i++) temp[i+t->len]=s->ch[i];
    我想问问楼主当i = s->len + t->len -1时,s->ch[i]能访问到吗?
2)再说删除函数
    char *temp;   
    for(i=0;i<pos;i++) temp[i]=s->ch[i];
    我想问问楼主,temp没分配内存也可以赋值吗?

    所以,一直插入,虽然有点错误,但是不影响程序执行;但是删除后在去插入,插入函数中的free释放的是temp值,temp是个野指针,free当然会报错了。

 在此给楼主提点建议
    1)问题不是这么问的,建议你先自己去找错,实在找不着,再来提问,发求助帖也需要技巧,这样的帖子高手是不会关注的。
    2)字符串不管是不是知道了长度,最后最好加上'\0'结束符。
    3)使用指针的时候,一定要小心谨慎。
   

2011-10-29 09:14
mfkvfhpdx
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-6-15
收藏
得分:0 
受教了
2011-10-29 16:26
快速回复:为什么删除之后再进行插入和删除会出现错误
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023972 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved