我设计的算法是用一个字符指针来存储删除后的字符串。
#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);
}
最后能运行,但结果是没有删除也没有统计数字。
各位大牛有没有更好点的算法。
我的设想,不设字符数组,因为字符数组设定了长度限制,假设不知道会输入多少个字符,也不想浪费内存。
而且有可能输入的字符每个都不一样,也有可能每个都一样。
9 个解决方案
#1
太晚了,先mark一下,明天继续。。。
#2
#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,如果有其他的也可以模仿这样来写的
#3
#4
帮你看了下 修改你的了
#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);
}
#5
老兄,你这个跟没改是一样的。
#6
“不设字符数组,因为字符数组设定了长度限制,假设不知道会输入多少个字符,也不想浪费内存”
这是我听过的最强大的理由。
没错,字符数组要预估要存储的字符的最大数目,可能不能使用你预申请的全部内存。
可你直接使用字符指针,它没有申请任何内存,允许你使用的内存大小是0啊同志!!!你怕浪费,于是你一个字节都不申请?直接使用?不错那才真叫没有天理!
因为你不一定要吃几个馒头,买一堆馒头可能浪费,所以你一个都不买?等着饿死吧。
这是我听过的最强大的理由。
没错,字符数组要预估要存储的字符的最大数目,可能不能使用你预申请的全部内存。
可你直接使用字符指针,它没有申请任何内存,允许你使用的内存大小是0啊同志!!!你怕浪费,于是你一个字节都不申请?直接使用?不错那才真叫没有天理!
因为你不一定要吃几个馒头,买一堆馒头可能浪费,所以你一个都不买?等着饿死吧。
#7
兄弟这话的意思就是必须要预申请内存空间喽。先要定义字符数组。
#8
多谢老兄啊,下面是我根据你给的算法改了一下,可以适合所有键盘能输入的字符:
#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);
}
#9
你又测试我修改你的代码么 我这边是可以的
#1
太晚了,先mark一下,明天继续。。。
#2
#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,如果有其他的也可以模仿这样来写的
#3
#4
帮你看了下 修改你的了
#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);
}
#5
老兄,你这个跟没改是一样的。
#6
“不设字符数组,因为字符数组设定了长度限制,假设不知道会输入多少个字符,也不想浪费内存”
这是我听过的最强大的理由。
没错,字符数组要预估要存储的字符的最大数目,可能不能使用你预申请的全部内存。
可你直接使用字符指针,它没有申请任何内存,允许你使用的内存大小是0啊同志!!!你怕浪费,于是你一个字节都不申请?直接使用?不错那才真叫没有天理!
因为你不一定要吃几个馒头,买一堆馒头可能浪费,所以你一个都不买?等着饿死吧。
这是我听过的最强大的理由。
没错,字符数组要预估要存储的字符的最大数目,可能不能使用你预申请的全部内存。
可你直接使用字符指针,它没有申请任何内存,允许你使用的内存大小是0啊同志!!!你怕浪费,于是你一个字节都不申请?直接使用?不错那才真叫没有天理!
因为你不一定要吃几个馒头,买一堆馒头可能浪费,所以你一个都不买?等着饿死吧。
#7
兄弟这话的意思就是必须要预申请内存空间喽。先要定义字符数组。
#8
多谢老兄啊,下面是我根据你给的算法改了一下,可以适合所有键盘能输入的字符:
#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);
}
#9
你又测试我修改你的代码么 我这边是可以的