注册 登录
编程论坛 C++教室

删除连续出现的相同字符,没有错误,结果却不对。。请问为什么啊?

境善 发布于 2013-12-01 12:41, 358 次点击
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int reduce (char s[])
{
    int len=strlen(s);
    char *scopy;
     scopy=(char *)malloc((len+1)*sizeof(char));

while(*(s+1)!='\0')
        {
        if(*s!=*(s+1))
            *scopy++=*s;
             s++;
            }

strcpy(s,scopy);
return len-strlen(scopy);
}

void main()
{
    char ss[]={"Press***12225"};
    int r;
    r=reduce(ss);
printf("%d\n",r);
}
2 回复
#2
左手拉一只猫2013-12-01 17:08
帮你看了下程序,这程序真心被你写的不怎么样。
顺便帮你指出问题:
(1)我运行的时候最后SS(你在主函数中用的)变量corrupt了,目测是在reduce函数中你最后把scopy复制给s的过程中出问题了,C语言里面字符串是以'\0'标识符结尾的,你的scopy目测没有。
(2)
while(*(s+1)!='\0')
最后一个字符你没有检查了。
(3)最大的BUG就是你在你的函数里面一直对S和scopy指针进行操作,最后这两个指针早就已经不是当年的模样了(乖乖指向字符串的头部),所以你后面的用strlen去测长度自然也会错。还有strlen函数是基于字符串中的‘\0’检测字符串是否结束,最好在scopy的最后加上避免出现无法预测结果。
这程序里面很多步骤都重复了,为了不混乱你的思路,还是照着你原来的思路改的,如下:
程序代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int reduce (char s[])
{
    int len=strlen(s);
    char *scopy;
    scopy=(char *)malloc((len+1)*sizeof(char));
    char *s1=s,*scopy1=scopy;    //用来暂存字符数组s和scopy的头部,因为你后面还要用,o(╯□╰)o

    while(*(s+1)!='\0')
     {
        if(*s != *(s+1))
        {*scopy++=*s;}
            s++;
      }
    //上面没有检查最后一个字符是否重复。。。
    if(*(s) != *(s-1))
    {*scopy++=*s;}
    *scopy='\0';
strcpy(s1,scopy1);
return len-strlen(scopy1);
}

void main()
{
    char ss[]={"Press***12225"};
    int r;
    r=reduce(ss);
    printf("%d\n",r);
}

P.S:其实你在函数中对数组进行查重复的过程中就可以对其中数字进行统计,最后用你的Len减一下不就好了,最后就不用再次用strlen()。其实也可以用数组形式去调用s[i]和scopy[i]的,好处是最后scopy和s还是指向字符数组的头部。不然还要用变量保存他们的指针。其实我想说用C++风格写的话可以更简洁的,不过学习总是渐进的。
坐等拿分,我吃饭去了,敲字有点小麻烦额。。。。。
#3
境善2013-12-01 22:04
回复 2楼 左手拉一只猫
嗯,完全明白了,非常感谢!讲解很详细
1