生成C中长度为N的所有字符串
我试着自己编写代码,结果失败了。这基本上就是我想要的:生成C中长度为N的所有字符串,c,algorithm,C,Algorithm,我试着自己编写代码,结果失败了。这基本上就是我想要的: a b ... z aa ba ... za ab bb ... zz aaa baa ... zzz 最后,它应该生成每一个短于N个字符的字符串,字符集为a-z。因此,我不是在寻找置换(其中1001个实现可以在互联网上找到),而是寻找带有替换的组合(至少在Python中是这样称呼的)顺序不重要,速度很重要。类似这样的东西(伪代码): void CompWithRep(字符串行,int N){ 字符c; 如果(N==0)返回; 因为(c=
a
b
...
z
aa
ba
...
za
ab
bb
...
zz
aaa
baa
...
zzz
最后,它应该生成每一个短于N个字符的字符串,字符集为a-z。因此,我不是在寻找置换(其中1001个实现可以在互联网上找到),而是寻找带有替换的组合(至少在Python中是这样称呼的)顺序不重要,速度很重要。类似这样的东西(伪代码):
void CompWithRep(字符串行,int N){
字符c;
如果(N==0)返回;
因为(c='a';c看起来像是要在c中使用它,这里有一种方法:
#include <stdlib.h>
#include <stdio.h>
int inc(char *c){
if(c[0]==0) return 0;
if(c[0]=='z'){
c[0]='a';
return inc(c+sizeof(char));
}
c[0]++;
return 1;
}
int main(void){
int n = 3;
int i,j;
char *c = malloc((n+1)*sizeof(char));
for(i=1;i<=n;i++){
for(j=0;j<i;j++) c[j]='a';
c[i]=0;
do {
printf("%s\n",c);
} while(inc(c));
}
free(c);
}
#包括
#包括
国际公司(char*c){
如果(c[0]==0)返回0;
如果(c[0]=='z'){
c[0]='a';
退货公司(c+sizeof(char));
}
c[0]++;
返回1;
}
内部主(空){
int n=3;
int i,j;
char*c=malloc((n+1)*sizeof(char));
对于(i=1),你还不够具体。正如你生成的“BAA”,你还会生成“ABA”、“ABB”和“AAB”吗?你在混合变量C、I和A.@ Yochai,请学习这行<代码>(C=‘a’;C< 26;C++)。
并研究.loop遍历字母。concat将新字母添加到您已有的行中,递归发送到N的深度。不要记住带字符串之类的C语法。@Yochai:我想@nightcracker是说您应该为(C='a';C<26++;C++)设置
是的,修复了这一点,这几乎是完美的,它跳过了第一次迭代(a,aa,aaa)。将while(inc(c))
更改为do…while();
循环修复了这一点。这里也没有理由使用malloc
,因为我不会保留兆字节(更不用说我们不应该在c中使用malloc
)除了那些小细节,你可以接受答案,+1:)很好,我修正了边做边做的事情。至于malloc的铸造,那可能是因为我用一些老式的编译器学习了C,而我没有…注意,sizeof(char)
根据定义总是1
。这意味着inc(C+sizeof(char))
工作正常,但看起来是错误的,因为指针运算已经以相应类型的单位完成了。
#include <stdlib.h>
#include <stdio.h>
int inc(char *c){
if(c[0]==0) return 0;
if(c[0]=='z'){
c[0]='a';
return inc(c+sizeof(char));
}
c[0]++;
return 1;
}
int main(void){
int n = 3;
int i,j;
char *c = malloc((n+1)*sizeof(char));
for(i=1;i<=n;i++){
for(j=0;j<i;j++) c[j]='a';
c[i]=0;
do {
printf("%s\n",c);
} while(inc(c));
}
free(c);
}