标题:删除连续出现的相同字符,哪出错了啊?
只看楼主
境善
Rank: 2
等 级:论坛游民
帖 子:76
专家分:16
注 册:2012-10-29
结帖率:86.21%
已结贴  问题点数:1 回复次数:6 
删除连续出现的相同字符,哪出错了啊?
#include <stdio.h>
#include <string.h>
int reduce (char s[])
{
    char *scopy;
int len=strlen(s),flag=0,count=0,totalcount;
for(int i=0;i<len-1;)
        {
        if(s[i]!=s[i+1]) *scopy++=*s;
          i++;
            }
*scopy='\0';
strcpy(s,scopy);
return len-strlen(scopy);
}

void main()
{
    char ss[]={"Press***12225"};
    int r=reduce(ss);
printf("%d",r);
}
搜索更多相关主题的帖子: include reduce count 
2013-11-29 23:51
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
得分:1 
额  程序应该运行不了吧  
原因是你的指针没有开辟空间...
在 reduce 函数 int 下面一行可以加上 scopy=(char*)malloc((len+1)*sizeof(char));

但这样你的程序还是不能达到你的要求...   字符指针可不是你那样用的

三十年河东,三十年河西,莫欺少年穷!
2013-11-30 00:51
qq404380
Rank: 2
等 级:论坛游民
帖 子:32
专家分:53
注 册:2012-7-23
得分:1 
困了 基本功能改了一下,你参考一下吧
#include <stdio.h>
#include <string.h>
#include <stdlib.h>//后面要用到malloc函数,申请空间的,将申请成功的看见首地址返回来,因为你的 * scopy 申请了 但是没有初始化地址,所以地址是随机的,在下面读取的时候会读取其他内存的数据,会段错误!所以要申请个空间把有效地址给他, 不知道你是在什么环境下编程的  我是在linux下的
int reduce (char s[])
{
    char *scopy;
    int i;
    int len=strlen(s),flag=0,count=0,totalcount;
    scopy=(char *)malloc(len);//申请空间的,将申请成功的看见首地址返回来给scopy
    for(i=0;i<len-1;i++)//这循环条件里能放int??  不知道
    {
        if(s[i]!=s[i+1])
        {
            *(scopy+i)=s[i];//
        }


    }
    *(scopy+i)='\0';//在最后给个空格,而不是原地赋值
    strcpy(s,scopy);
    return len-strlen(scopy);
}

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


大概就是这样吧
2013-11-30 01:47
li_local
Rank: 2
等 级:论坛游民
帖 子:35
专家分:59
注 册:2013-11-21
得分:1 
楼上两位正解! 按照你的编程思路,需要申请一块堆空间(栈空间也可以,控制好空间大小)暂时存储不重复的字符,然后再将暂存的字符拷贝至输出字符数组;
2013-11-30 09:42
逆风而前
Rank: 7Rank: 7Rank: 7
来 自:福建
等 级:黑侠
威 望:7
帖 子:193
专家分:567
注 册:2013-2-14
得分:1 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int reduce (char s[])
{
    char *scopy;
    int i;
    int len=strlen(s),flag=0,count=0,total;
    scopy=(char*)malloc((len+1)*sizeof(char));
    char *p=scopy;
    for(i=0,*(scopy)=s[i];i<len-1;)
    {
        if(*scopy!=s[i+1])
        {
            scopy++;
            *scopy=s[i+1];
            
        }
        i++;
    }
    *(++scopy)='\0';
    total=strlen(p);
    for(i=0;*p!='\0';i++)
    {
        s[i]=*p;
        p++;
    }
    s[i]='\0';
   
    return len-total;
}

void main()
{
    char ss[]={"Press***12225"};
    printf("删除前字符串为:%s\n",ss);
    int r=reduce(ss);
    printf("删除了%d个字符\n",r);
    printf("删除后字符串为:%s\n",ss);
}


[ 本帖最后由 逆风而前 于 2013-11-30 10:28 编辑 ]
2013-11-30 10:19
境善
Rank: 2
等 级:论坛游民
帖 子:76
专家分:16
注 册:2012-10-29
得分:0 
回复 3楼 qq404380
额,你这个结果是错的。。。
2013-11-30 23:36
境善
Rank: 2
等 级:论坛游民
帖 子:76
专家分:16
注 册:2012-10-29
得分:0 
回复 5楼 逆风而前
你好!我又这样改了一下,可是怎么还不对啊。。。麻烦指点一下。。谢谢啊
#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++;
            }
*scopy='\0';
strcpy(s,scopy);
return len-strlen(s);
}

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



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-424435-1-1.html




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

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