Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
生成C中长度为N的所有字符串_C_Algorithm - Fatal编程技术网

生成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);
}