题目描述:点击打开链接
值得一提的是:这个问题调用了递归的方法来解决问题
另外,一开始的时候,我在cmp_char里面直接使用了return strcmp(*((char*)a),*((char*)b)); 却忘记了strcmp是要对比字符串,所以会往后扫描直到'\0',所以会访问他不该访问的内存,导致程序出错!这也说明了,写程序的时候,写完一个阶段,就去debug一下,这样可以减少最后再debug的时候带来的痛苦感觉。
解决方法:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void solve();
int main(){
int t;
int k;
scanf("%d\n",&t);
for(k=0;k<t;k++){
printf("case #%d:\n",k);
solve();
}
}
//1. 读入数据,保存到一个字符串数组里面str_in里面
//2. 找出str_in里面不同的字母,放在str_diff里面。个数就是stelen(str_diff),或者保存到num里面
//3. 对str_diff进行排序,变成升序,从str_diff[0]开始存放。
//4. 使用递归解决。
int cmp_char(const void *a,const void *b){
char c1[2],c2[2];
c1[0] = *(char*)a;
c2[0] = *(char*)b;
c1[1] = '\0';
c2[1] = '\0';
return strcmp(c1,c2);
}
void comb(char *s, char * t){
char tt[17];
if(*s){
sprintf(tt,"%s%c",t,s[0]);
printf("%s\n",tt);
comb(s+1,tt);
comb(s+1,t);
}
}
void solve(){
char str_in[17];
char str_diff[17];
char t[17];
t[0] = '\0';
int k,i;
int num_diff;
int flag;
//initialization
num_diff = 0;
k = 0;
for(k=0;k<17;k++){
str_diff[k] = -1;//先初始化为0,代表这个里面没有存放字符
}
flag = 0;//flag=0代表这个字符之前没有记录过
scanf("%s",str_in);
for(k=0; k < strlen(str_in); k++){
flag = 0;
for(i=0;i<num_diff;i++){
if(str_diff[i] == str_in[k]){
flag = 1;//这个字符之前就记录过了
break;
}
}
if(flag == 0){
str_diff[num_diff++] = str_in[k];
}
}
str_diff[num_diff] = '\0';
qsort(str_diff,num_diff,sizeof(str_diff[0]),cmp_char);
comb(str_diff,t);
}