纠错:C语言:删除重复字符。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了纠错:C语言:删除重复字符。相关的知识,希望对你有一定的参考价值。
7-60 删除重复字符(20 分)
本题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。
输入格式:
输入是一个以回车结束的非空字符串(少于80个字符)。
输出格式:
输出去重排序后的结果字符串。
输入样例:
ad2f3adjfeainzzzv
输出样例:
23adefijnvz
我的程序:
#include <stdio.h>
#include <string.h>
int main()
char Letter[128]=0;
char delete[]=0;
gets (Letter);
int size=sizeof(Letter)/sizeof(Letter[0]);
for(int i=0; i<size; i++)
delete[Letter[i]]=1;
for(int i=0; i<=128; i++)
if(delete[i]==1)
printf("%c", i);
printf("\n");
return 0;
测试结果:
多种错误
没注释, 还不如重新写一个
#include <stdio.h>#include <stdlib.h>
int main()
char Letter[80]; //用于接收输入字符串
int result[128]=0; //相当于一张空的ASCII码表
gets(Letter);
int size=strlen(Letter);
int i,j=0;
for(i=0;i<size;i++) //该循环好比
//字符串中的每个字符在空ASCII码表中打勾
result[Letter[i]]=1;
memset(Letter,'\\0',80); //重置为空字符串
for(i=0;i<128;i++) //检索ASCII码表,逐个写入字符数组中
if(result[i]==1) //只要ASCII码表中打了勾的字符,就写入数组
Letter[j++]=i;
printf("\\n%s",Letter);
return 0;
参考技术A 虽然其他给出了正确答案,但是考虑你的思路,修改代码如下:
#include <stdio.h>
#include <string.h>
int main()
char Letter[128]= 0;
char delete[128]= 0,; //用于存储Letter[128]数组哪些属于相同字符,相同就置1.
int i,j;
gets (Letter);
int size=strlen(Letter); //确定输入字符串的个数
for(i=0; i<size; i++)
if(delete[i]==0) //判断是否已经是相同字符
for (j=i+1;j<128;j++)
if(Letter[j]==Letter[i]) //判断两个字符是否相同
delete[i]=1; //将第一个字符位置置1
delete[j]=1; //
for(i=0; i<=size; i++)
if(delete[i]==0) //判断是否属于相同字符,不是才打印
printf("%c", Letter[i]); //显示字符
printf("\\n");
return 0;
输入:ad2f3asjfeainzzzv
输出:d23sjeinv 参考技术B 程序的基本思路是把输入的字符串放到a[100]字符组中,然后把a[100]中所有不重复的字符添加到b[100]中,间接完成对字符串中的重复字符的删除
#include
void main()
char a[100],b[100];
//定义两个字符组,a[100]用来接收输入的字符串,b[100]用来存储不重复的字符
int pa=0,pb=0,i,flag;
scanf("%s",a);
//输入字符串到a[100]中,用scanf读入到a[100]中会自动在a[100]中字符串结束的地方加上'\0'
for(pa=0;a[pa]!='\0';pa++)
//for循环结束的条件是a[pa]==0,也就是从a[100]字符组中读取一个字符,直到没有
flag=1;
//flag是个标志符,当flag==1时,说明这个字符(下句中的a[pa])是第一次出现,应该加入到b[100]中
//如果flag==0,说明这个字符(下句中的a[pa])重复了,不应该加到b[100]中
for(i=0;i<pb;i++) if(b[i]==a[pa]) flag=0;
//把a[100]中读取的字符a[pa]与b[100]中的所有字符进行比较,如果b[i]==a[pa]
//说明这个字符已经在b[100]中了,也就是重复字符了,所有将flag=0,不能加入b[100]中
//如果a[pa]与b[100]中的所有字符都不相等,说明这个字条是第一次出现,应该加到b[100]
if(flag)
b[pb]=a[pa];pb++;
//如果flag==1,则将a[pa]这个字符加入到b[100]中,然后将pb加1
b[pb]='\0';
//当所有的不重复的字符都加入到b[100]中时,将b[100]中字符结束的地方加'\0',也就是b[pb]='\0'
//因为字符串都是民'\0'结尾的,所以加上这句
printf("%s\n",b);
//输出b[100]中的字符串,也就是删除过重复字符之后的了
参考技术C #include <stdio.h>
#include <string.h>
int main()
char Letter[128]=0;
char deleter[128]=0;
gets(Letter);
int k=0;
for(int i=0; i<strlen(Letter); i++)
for(int j=0; j<strlen(Letter); j++)
if(i!=j)
if(Letter[i]==Letter[j]) break;
else if(j==strlen(Letter)-1)deleter[k++]=Letter[i];
//对deleter排序代码
puts(deleter);
return 0;
C语言删除一个整型数组里面重复的元素
利用双重循环,将每个值依次与其后面的值相比较,如果有相同的则删除该元素即可。
删除时,可以使用将后面元素依次向前移动一位,同时总长度减一的方式。
参考代码如下:
int remove_repeat(int *a, int l)int i, j, k;
for(i = 0; i < l; i ++)
for(j = i+1; j <l; j ++)//对后面每个元素比较,去重。
if(a[j] == a[i])//发现重复元素。
for(k = j+1; k<l; k ++)//依次前移一位。
a[k-1] = a[k];
l--;//总长度减一。
return l;//返回新的长度值。
参考技术A int i, j;
int buf[] = 1,2,3,3,2,1;
int count = strlen(buf);
for(i = 0; i < count; i++)
for(j = i+1; j < count; j++)
if(buf[i] == buf[j])
buf[j] ^= buf[count];
buf[count] ^= buf[j];
buf[j] ^= buf[count];
count--;
buf[count] = '\0';
提供给你个思路 我没有调试,不过思路我觉得不错!
就是从数组里第一个元素开始找相同的,如果相同就把 相同元素和数组最后一位交换,下一个相同的就和数组倒数第二位交换,最后把 count位变成‘/0’,最后打印数组。 参考技术B 我跟你直接说思路吧,他们这样的双重循环数组太大的话很耗时间的,你可以,先给数组排序,然后删除多余的数就很耗操作了,只需要看相邻的数就可以了。 参考技术C 将第一个元素输出,再后面的一个个与前面的比较,有相等的就继续循环,不等的就输出,用for语句做 参考技术D int elimination(int a[], int count) //去除数组中重复的元素
int i, j, k;
for (i = 0; i < count; i++)
for (j = i + 1; j < count; j++)
if (a[j] == a[i])
for (k = j + 1; k< count; k++)
a[k - 1] = a[k];
count--;
j--;
return count;
以上是关于纠错:C语言:删除重复字符。的主要内容,如果未能解决你的问题,请参考以下文章