| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2417 人关注过本帖
标题:为什么这个函数只能调用一次,调用第2次机会出现错误
只看楼主 加入收藏
w857191509
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2015-8-25
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
为什么这个函数只能调用一次,调用第2次机会出现错误
# include <stdio.h>
# include <malloc.h>



struct pp
{
    char *k;
    struct pp *cj;
};
void sp(char *c,struct pp *pc,char *len1,int pl,char **RT)
{
    int len=1;
    int pdf=1;
    int pd=1;
    int ii=0;
    pc=(struct pp *)malloc(sizeof(struct pp));//第一次调用的时候这里没出现问题,第2次调用的时候这里pc地址=0x0000000空
    char *js=0;
    struct pp *s=pc;
    pc->cj=NULL;
   
    while(len=*c)
    {
        if(len<0)
        {
            pdf=pdf+1;
            
        }
        if(len==0)
        {
            //printf("字符串=NULL/字符串个数=%d\n",len);
            //getchar();
        }
        else
        {
            struct pp *sv=(struct pp *)malloc(sizeof(struct pp));
            sv->k=c;
            //printf("%c\n",*c);
            s->cj=sv;
            sv->cj=NULL;
            s=sv;
            pdf++;
            if(len<0)
            {
                //printf("第%d元素类型为中文无法显示  ",pd++);
                //printf("%c%c\n",c[0],c[1]);
                //c++;
            }
            else
            {
                //printf("第%d元素是%c\n",pd++,*c);
            }
            c++;
        }
        
    }
        //printf("字符指针扫描完成!长度为%d\n",pd-1);
        //printf("实际长度为%d\n",pdf-1);
        struct pp *cr=pc;
    for (int i=1;i<=pl;i++)
    {
        cr=cr->cj ;
        //printf("%c\n",*(cr->k) );
        //printf("%d\n",i);
        //getchar();
    }
   
        cr->k=len1;
    //printf("%c",*(cr->k));
        /*struct pp *lP=pc->cj;
        char *NU='\0';
        struct pp *WI=(struct pp *)malloc(sizeof(struct pp));
        WI->cj =NULL;
        //WI->k=*NU;
        for(int len3=1;len3<=(pd-1);len3++);
        {
            lP=lP->cj;
            printf("最后%#X\n",lP );
        }*/
        
        
        //getchar();
        struct pp *se=pc->cj;
        char *zf=(char *)malloc(sizeof(char)*pd-1);
        int cs=1;
        int len2=0;
        while(se->cj!=NULL/*,(len2++)!=(pd-1)*/)
        {
            //len2=len2+1;
            cs=*(se->k);
            if(cs<0)
            {
                zf[len2+1]=*(se->k);
                zf[len2+2]=*(se->k);
            

                getchar();            //printf("%c%c",se->k[0],se->k[1]);
            }
            else
            {
                zf[len2]=*(se->k);
                //printf("%c",*(se->k) );
               
            }
   
            se=se->cj;
            len2=len2+1;
            /*if(len2==(pd-1))
            {
                char *NU='\0';
                se->k=NU;
            }*/

            
        }
        zf[len2]='\0';
        //for(int u=0;u<=10;u++)
   
        //printf("%s\n",zf);
        
        *RT=zf;
    return;
}
int main(void)
{
   
    struct pp pc;
    char * str="12345678ABCDTSDHFdfjddfg PPPat!=NULL";//暂时不能装中文,编码不懂,
                                                
    printf("原始str==%s\n",str);
    char g='B';
    sp(str/*指针字符串的地址*/
        ,&pc
        ,&g/*替换g变量*/
        ,3/*在第str[?个位置修改]*/
        ,&str/*字符串地址的地址*/);
        printf("输出str==%s\n",str);
        
//为什么函数不能调用2次,调用了会出错
    sp(str/*指针字符串的地址*/
        ,&pc
        ,&g/*替换g变量*/
        ,3/*在第str[?个位置修改]*/
        ,&str/*字符串地址的地址*/);


        printf("输出str==%s\n",str);









    //str=0;
    //int cd=*str;
    //
    /*for(int i=0;i<9;i++)
    {
        if(*str==0)
        {
            printf("结束!\n");
            getchar();
        }
        else
        {
            printf("%c ",*str);
            printf("当前str16进制地址为;%#x \n",str);
            printf("当前*str16进制地址为;%#x \n",*str);
            printf("当前*str16&进制地址为;%#x \n",&(*str));
                getchar();
        }
        str++;
    }*/


   
    return 0;
}
搜索更多相关主题的帖子: include 
2015-08-25 23:56
小K001
Rank: 2
等 级:论坛游民
帖 子:8
专家分:22
注 册:2015-8-26
收藏
得分:7 
您的结构成员也是指针,malloc之后结构成员是野指针。会不会这里有误
2015-08-26 08:35
n0noper
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:39
专家分:159
注 册:2015-3-21
收藏
得分:7 
楼主,除了你第二个while的个数有点问题外,
char *zf=(char *)malloc(sizeof(char)*pd-1);
这里,pd是1,是不是应该是pdf?(修改之后可以,但是为啥呢?malloc(0)虽然没啥用,但是测试了一下好像是不会出错的啊~~~)

无奈boss巡视。。。晚上下了班再讨论。如果楼主知道怎么错了,求告知!
小菜路过~~~留下一片脚印

不骄不躁,不卑不亢;虚怀若谷,宠辱不惊。
2015-08-26 12:05
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:7 
这是简单问题复杂化,为用指针而强用指针,也为用动态分配而强用动态分配。

授人以渔,不授人以鱼。
2015-08-26 12:19
w857191509
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2015-8-25
收藏
得分:0 
修改改好了,就是不知道汉字怎么处理
# include <stdio.h>
# include <malloc.h>

struct pp
{
    char *k;
    struct pp *cj;
};
int Length(char *JS);
void Modify(char **str,int WZ,char DATA);
int Length(char *JS)/*获取字符串个数*/
{
    int len1=0;
    while(int i=*JS)
    {
        if(i!=0)
        {
            len1++;
        JS++;
        }
        
    }
    return len1;
   
}
void Modify(char **str,int WZ,char DATA)
{
    char *zf=(char *)malloc(sizeof(char )* Length(*str));//分配内存
    int len=1;
    struct pp *pc=(struct pp *)malloc(sizeof(struct pp));
    struct pp *s=pc;
    pc->cj=NULL;
    while(len=**str)
    {
        
            struct pp *sv=(struct pp *)malloc(sizeof(struct pp));
            sv->k=(*str);
            s->cj=sv;
            sv->cj=NULL;
            s=sv;
            (*str)++;
        
        
    }
    struct pp *cr=pc->cj;
    for (int i=1;i<=WZ;i++)/*在指定位置修改字符串*/
    {
        cr=cr->cj ;
        
    }                        
   
        cr->k=&DATA;
        struct pp *se=pc;
        int cs=1;
        int len2=0;
        while(se->cj!=NULL)
        {
        se=se->cj;
        cs=(int)*(se->k);
        zf[len2]=*(se->k);
        len2=len2+1;

        }
        zf[len2]='\0';
        struct pp *t=pc;
        struct pp *j=t;
        while(j->cj!=NULL)/*释放动态链表*/
        {
            j=t->cj;
            free(t);
            t=j;
        }
        free(t);
        *str=zf;
        
    return;
}
int main(void)
{
   
    struct pp pc;
    char * str="123456789111***++*------***/bbbbbxbxxxxxxxxx0XCCCCCCCC";//不能装中文
    char pi[]="AB";
    printf("原始数据\n%s\n",str);

    ///////////////////////////////////////////////////////////

    for(int i=0;i<Length(pi);i++)
    {
        Modify(&str,i,pi[i]);//注意不是真正的修改,假象也不完全算是,
   
    }                        //那位大神帮我处理怎么发送汉字过去,并且修改,中文处理不会
                        
    printf("->修改为\n%s\n",str);
    /////////////////////////////////////////////////

    Modify(&str,40,'^');
    printf("->修改为\n%s\n",str);
    return 0;
}
2015-08-30 04:23
w857191509
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2015-8-25
收藏
得分:0 
回复 4楼 TonyDeng
我听不懂啊,这句话什么意思啊
2015-08-30 04:25
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用w857191509在2015-8-30 04:25:09的发言:

我听不懂啊,这句话什么意思啊

意思就是:可以不用指针把程序写的更正确、更清晰的你不用,非要写晦涩、易错的版本,那么错误就是自找的。说得更坦白的,就是你弄对了,也不说明学得好了,反而是往邪路走得更深入。

授人以渔,不授人以鱼。
2015-09-01 13:45
w857191509
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2015-8-25
收藏
得分:0 
回复 4楼 TonyDeng
来自2020年的谢谢,原谅这句迟到的谢谢
2020-04-01 19:28
w857191509
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2015-8-25
收藏
得分:0 
回复 7楼 TonyDeng
缘分 2021/5/23  
2021-05-23 23:47
快速回复:为什么这个函数只能调用一次,调用第2次机会出现错误
数据加载中...
 
   



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

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