循环遍历所有可能的长度为n的字符串

时间:2014-01-20 13:23:10

标签: c cstring c-strings

我正在编写一个程序,必须遍历所有可能的字符串,大小为n。这是它的代码。

int len, endlen = atoi(argv[2]);
int i, j, k;
f = fopen(argv[1], "wb");
for (len = 0; len < endlen; len++)
{
    for (i = 0; i < len; i++)
    {
        for (k = 32; k < 127; k++)
        {
            entry.len = len;
            string[i] = k;
            memcpy(entry.string, string, 65);
            sha256(string, entry.outbuf, len);
            fwrite(&entry, sizeof(struct hashentry), 1, f);
            fflush(f);
        }
    }
    printf("\rLength done: %d of %d", len, endlen);
    fflush(stdout);
}

只需修改字符串的一个索引即可返回。它需要做一些像二进制计数一样的事情。

000
001
010 <--It moved over
011 <--Now it modified the previous one
100 <--moved again
101 <--Modifying previous
110
111 <--...etc

任何帮助?

*编辑:我需要的东西会给我从size = 1到size = endlen的所有字符串。这就像

"a"
"aa"
"aaa"
"aaaa"
"aaaaa"
or
"a"
"b"
"c"
...
"aa"
"ab"
"ac"
...
"aaaaa"
"aaaab"
"aaaac"
...
"abcde"

1 个答案:

答案 0 :(得分:1)

这里需要endlen嵌套循环。您可以使用递归方法避免明确地编写它们:

void all_combinations( char* x, const int len )
{
    for (char c = 65; c < 70; ++c){
        x[len] = c;
        if (len>0){
            all_combinations( x, len - 1 );
        } else {
            printf( "%s\n", x );
        }
    }
}

int main()
{
    const int maxlen = 3;
    char x[maxlen+1];
    for( int thislen=1; thislen<=maxlen; thislen++ ){
        x[thislen] = 0;
        all_combinations( x, thislen-1 );
    }
}