求C语言代码,删除字符串中重复字符 如输入"aabbcc",要求输出"abc"

答案的程序如下:
#include <stdio.h>
int main() {
char s[256];
int i = 0, tmp[256] = {0};
printf("Enter the string :\n");
gets(s);

while(s[i] != '\0')
tmp[s[i++]] = 1;

puts("\nAfter sort and delete operation:");
for(i = 0; i < 256;i++)
if(tmp[i])
printf("%c", i);
return 0;
}
其中的tmp[s[i++]] = 1是什么意思呢 ?最后 for(i = 0; i < 256;i++) 又是怎么回事呢?能不能详解一下,谢谢哈

字符也可以使用整数来表示,其实整数0-255用%c来输出就是字符。
#include <stdio.h>
int main() {
char s[256]; /*初始化了一个数组来存放输入的串*/
int i = 0, tmp[256] = {0}; /*tmp是一个256个整型数组,初始化成全0*/
printf("Enter the string :\n");
gets(s); /*将输入的串存到s中*/

/*分析每个输入的字符,如果字符是'a' 则a=97,那么 tmp[97]将置成1 ,如果下一个字符串还是
'a',那么同样tmp[97]置成1,如果下一个字符是'b',那么tmp[98]将置成1......*/
while(s[i] != '\0')
tmp[s[i++]] = 1;

puts("\nAfter sort and delete operation:");
/*顺序输出255个字符中s串中包含的字符*/
for(i = 0; i < 256;i++)
if(tmp[i])
printf("%c", i);
return 0;
}

那么等于是说全部ascii字符集是256个,如果有哪个字符那么就把它标记上,然后再从0开始顺序输出就可以了。
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-06-15
每一个字符都会对应一个asc码,你可以试着将一个字母用整型输出,就会得到一个数,那就是它的asc码。这个程序里的tmp[s[i++]],就是将字符元素s[i++]的asc码作为tmp数组的序号,如果 s[1]和s[2]都是同一个字母的话,那他们的asc码就是同一个数,假设就是23吧,那就容易看出本来是两个元素,但对应tmp数组时,就都是tmp[23],再结合输出部分的形式 if(tmp[i]) printf("%c", i); 就达到了去除重复的目的了,这里你应该能看出,一个字符对应一个asc码(就是数字),一个数字(一定范围内的)当然也就对应一个字符,最后的输出部分printf("%c", i); 正是将asc码再重新转回字符输出。至于 for(i = 0; i < 256;i++) ,那就是一个一个地输出嘛。这个程序其实不仅能去除重复的字母,而且还能对剩下的字母进行排序,你看那句话 puts("\nAfter sort and delete operation:"); 不就说地很清楚吗,“经过排序和删除后”。其中原理你如果懂我上面所说的话,也就不难理解了。最后我想说这个程序还是很巧妙的,谢谢你的分享。
第2个回答  2011-06-15
这个程序呢...怎么说呢...它并不是把重复的字符删了...只是在最后输出的时候仅输出一次而已,而且最后输出是是按顺序排序过的.
对C语言来说,字符也是数字,是取值0~255的数字.所以它构造了一个长度为256的tmp数组.
tmp[s[i++]]=1就是取s字符串的第i个字符s[i],它也是个数字,对应tmp数组中的tmp[s[i]],令其为1,表示s[i]字符出现过一次了,然后再让i+1.
那么for(i = 0; i < 256;i++) 就好理解了,就是看长度为256的tmp数组中那些是1,是1的就代表着该字符出现过,那么只要把i当作字符打出来即可.

求C语言代码,删除字符串中重复字符
include <string.h>;main(){ char str[100],*p,*q,*r,c;printf("请输入字符串:";\/\/gets(str);scanf("%s",str);for(p=str;*p;p++){ for(q=r=p;*q;q++)if(*r>;*q)r=q;if(r!=q){ c=*r; *r=*p; *p=c;} } \/\/冒泡排序的代码 printf("结果字符串为:%s\\n",s...

C语言设计一个函数,输入一字符串,逐个重复输出,例如输入abc,输出aa
include <stdio.h>int main(void){ char temp = 0; printf("请输入字符串:"); while((temp = getchar()) != '\\n') for(int i = 0; i < 2; ++i) printf("%c",temp); printf("\\n"); return 0;} ...

下面这个c语言程序的计算结果为什么是aabbcc?求大家帮忙解答一下_百度...
printf("a%cb%cc%c\\n",c1,c2,c3)第一个%c是输出c1,第二个%c是输出c2,第三个%c是输出c3,你每一个%c前面多了一个a,b,b.输出就是a c1 b c2 c c3,aabbcc

abcdef插入到另一个字符串ABCDEF中得到aAbBcCdDeEfF用C语言怎么编写啊...
int main(){ char *str1="ABCDEF";char *str2="abcdef";char result[32]={};int i=0;while( *str2 ){ if ( *str1 ) result[i++]=*str1++;result[i++]=*str2++ ;} printf("result:%s\\n",result );return 0;} ...

在C语言中字符串的替换如何实现的!
1、首先输入代码:include <string.h> include <stdio.h> \/ 参数:originalString[] :原始字符串 key[] : 待替换的字符串 swap[] : 新字符串 \/ void replace(char originalString[], char key[], char swap[]){ int lengthOfOriginalString, lengthOfKey, lengthOfSwap, i, j , flag;char...

如何判断一个字符串是否是回文
以下是C语言实现判断回文字符串的代码。include<stdio.h>#include<string.h>int main(void){ char s[30]; int b=0; \/\/1表示不是回文字符串 puts("请输入一个字符串:"); scanf("%s",s); for(int i=0;i<strlen(s)\/2;i++) if(s[i]!=s[strlen(s)-i-1]) ...

如何去掉文本中的回车换行符或任意字符
1 MOVE.exe是C语言编写的一个小软件,双击执行之后会将d:\\\\abc.txt中的回车换行符全部去掉。所以首先需要把需要处理的文本改名为abc.txt,然后放在D盘中;执行MOVE.exe就行了。2 代码如下:编译代码很简单,用VC6.0建立工程编译即可得到MOVE.exe,读取"d:\\\\abc.txt",过滤回车换行符,将需要的...

求一fortran或C语言程序,求6个元素的所有6个元素的组合。
); else printf("%c",a[i]); } if(t==0) break; j=FirstL(a,n); k=FirstG(a,j,n); swap(a,j,k); reversal(a,j,n); }}输出结果很多,只能截取部分,望采纳~

string字符串赋值?
2、stringLSStr,LSStrA;\/\/定义LSStr=aabbccdd\/\/赋值LSStrA=LSStr;\/\/同类赋值不同编译环境下的C++,对字符串的处理稍有差别。最原始的C语言中,没有string,在C++里才有了string这个类。3、双引号主要做了3个工作,分别是:(1)申请了空间(在常量区),存放了字符串。(2)在字符串尾加上...

string字符串赋值?
2、stringLSStr,LSStrA;\/\/定义LSStr=aabbccdd\/\/赋值LSStrA=LSStr;\/\/同类赋值不同编译环境下的C++,对字符串的处理稍有差别。最原始的C语言中,没有string,在C++里才有了string这个类。3、双引号主要做了3个工作,分别是:(1)申请了空间(在常量区),存放了字符串。(2)在字符串尾加上...

相似回答