我正在编写一个程序,必须遍历所有可能的字符串,大小为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"
答案 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 );
}
}