帮忙看下代码和算法,哪里不对?谢了。

zhfrush200 2012-11-12 09:18:59
记不清是在哪个网站看到一个问题:有字符串:“aabbccddeeffgg”。反正就一个字符串,把里面字符相同的全部删除,然后输出删除后的字符串和删除了多少个字符的数目。如上面的字符就输出"abcdefg",和7。
我设计的算法是用一个字符指针来存储删除后的字符串。
#include<stdio.h>
int moster(char *x, char *y)
{
if(*x!='\0'&&*x!=y) /*如果*x不是空字符和*x与y不相等那么就让y再与下x的下个字符相比*/
moster(x+1,y);
else if(*x=='\0'&&*x!=*y)
return 1;
else
return 0;
}
void main()
{
char *ch, *p, *c, *p2;
int num=0;
printf("input a sentence:");
gets(ch);
*c='\0';
p2=c;
for(p=ch; *p!='\0'; p++)
{
if(moster(c,p)) /*如果moster函数返回了1那么就证明*p与c中存储的字符没有相同的*/
{
*p2++=*p; /*将*p的字符赋给*p2所指向的c*/
*p2='\0'; /*因为怕这是最后一个不相同的字符所以给赋个空字符*/
}
else
num++; /*这是统计删除了多少个字符*/
}
printf("This is deleted same letters sentence:\n");
printf("%s\n",c);
printf("deleted %d letters.\n",num);
}

最后能运行,但结果是没有删除也没有统计数字。
各位大牛有没有更好点的算法。
我的设想,不设字符数组,因为字符数组设定了长度限制,假设不知道会输入多少个字符,也不想浪费内存。
而且有可能输入的字符每个都不一样,也有可能每个都一样。
...全文
804 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
longburulin 2012-11-13
  • 打赏
  • 举报
回复
#include<iostream>
#include<string.h>
#include<stdio.h>
int main()
{
   char s[100],str[100];
   scanf("%s",s);
   int len=strlen(s);
   int flag[30],cnt=0;
   memset(flag,0,sizeof(flag));
   for(int i=0;i<len;i++)
   {
      if(flag[s[i]-'a']==0)
      {
         str[cnt++]=s[i];
         flag[s[i]-'a']=1;
       }
   }
    str[cnt]=0;
    printf("%s\n",str);
    return 0;
}              
假如只是小写字母 可以按上面的算法 若出现了就给flag的相对下标为1,如果有其他的也可以模仿这样来写的
longburulin 2012-11-13
  • 打赏
  • 举报
回复
帮你看了下 修改你的了

#include<stdio.h> 
#include<stdlib.h>
#include<string.h>
int moster(char *x, char *y)
{     
	if(*x!='\0'&&*x!=*y)   /*如果*x不是空字符和*x与y不相等那么就让y再与下x的下个字符相比*/    
		moster(x+1,y);   
	else if(*x=='\0'&&*x!=*y)     
		return 1;    
	else        
		return 0; 
} 
void main() 
{     
	char ch[100], *p, c[100], *p2;     //必须为字符 或者申请地址吧
	int num=0;     
	printf("input a sentence:");     
	gets(ch);     
	*c='\0';   
	p2=c;    
	for(p=ch; *p!='\0'; p++)    
	{         
		if(moster(c,p))   /*如果moster函数返回了1那么就证明*p与c中存储的字符没有相同的*/      
		{           
			*p2++=*p;   /*将*p的字符赋给*p2所指向的c*/    
			*p2='\0';      /*因为怕这是最后一个不相同的字符所以给赋个空字符*/      
		}      
		else        
			num++;     /*这是统计删除了多少个字符*/    
	}     
	printf("This is deleted same letters sentence:\n");    
	printf("%s\n",c);   
	printf("deleted %d letters.\n",num); 
} 

longburulin 2012-11-13
  • 打赏
  • 举报
回复
引用 8 楼 zhfrush200 的回复:
引用 2 楼 longburulin 的回复: C/C++ code? 12345678910111213141516171819202122 #include<iostream> #include<string.h> #include<stdio.h> int main() { char s[100],str[100]; scanf("%s",s); in……
你又测试我修改你的代码么 我这边是可以的
zhfrush200 2012-11-13
  • 打赏
  • 举报
回复
引用 2 楼 longburulin 的回复:
C/C++ code? 12345678910111213141516171819202122 #include<iostream> #include<string.h> #include<stdio.h> int main() { char s[100],str[100]; scanf("%s",s); int len=strlen(s); int f……
多谢老兄啊,下面是我根据你给的算法改了一下,可以适合所有键盘能输入的字符:
#include<stdio.h>
#include<string.h>
int main()
{
	int i, len, num=0, flag[96];
	char frist[100], box[100];
	
	printf("input a sentence:");
	gets(frist);
	len=strlen(frist);
	memset(flag,0,sizeof(flag));
	
	for(i=0; i<len; i++)
	if(flag[frist[i]-32]==0)
	{
		box[num++]=frist[i];
		flag[frist[i]-32]=1;
	}
	box[num]='\0';
	
	printf("deleted same characters %d.\n",len-num);
	printf("%s\n",box);
}
zhfrush200 2012-11-13
  • 打赏
  • 举报
回复
引用 6 楼 baichi4141 的回复:
“不设字符数组,因为字符数组设定了长度限制,假设不知道会输入多少个字符,也不想浪费内存” 这是我听过的最强大的理由。 没错,字符数组要预估要存储的字符的最大数目,可能不能使用你预申请的全部内存。 可你直接使用字符指针,它没有申请任何内存,允许你使用的内存大小是0啊同志!!!你怕浪费,于是你一个字节都不申请?直接使用?不错那才真叫没有天理! 因为你不一定要吃几个馒头,买一堆馒头可能浪费,……
兄弟这话的意思就是必须要预申请内存空间喽。先要定义字符数组。
baichi4141 2012-11-13
  • 打赏
  • 举报
回复
“不设字符数组,因为字符数组设定了长度限制,假设不知道会输入多少个字符,也不想浪费内存” 这是我听过的最强大的理由。 没错,字符数组要预估要存储的字符的最大数目,可能不能使用你预申请的全部内存。 可你直接使用字符指针,它没有申请任何内存,允许你使用的内存大小是0啊同志!!!你怕浪费,于是你一个字节都不申请?直接使用?不错那才真叫没有天理! 因为你不一定要吃几个馒头,买一堆馒头可能浪费,所以你一个都不买?等着饿死吧。
zhfrush200 2012-11-13
  • 打赏
  • 举报
回复
引用 4 楼 longburulin 的回复:
帮你看了下 修改你的了 C/C++ code? 123456789101112131415161718192021222324252627282930313233343536 #include<stdio.h> #include<stdlib.h> #include<string.h> int moster(char *x, char *y) { ……
老兄,你这个跟没改是一样的。
14号选手 2012-11-12
  • 打赏
  • 举报
回复
太晚了,先mark一下,明天继续。。。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧