2014-01-20 109 views
0

我有一個程序,我正在編寫它必須遍歷所有可能的字符串到n的大小。這是它的代碼。循環遍歷所有可能的字符串的長度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

您會得到什麼輸出? – suspectus

+0

你的問題不清楚 – exexzian

+0

如果你計算你的兩個iner loop,你只能得到len * 96的迭代次數。這太低了,無法獲得所有96^len的組合。 你需要len嵌套循環(或等價的東西,最有可能是一個遞歸函數)通過​​所有的組合。順便說一下,這很快就會變成一個令人憤慨的數字(在endlen 9中,你會得到幾十萬億字符串)。 – lrn

回答

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); 
    } 
} 
+0

你能解釋65和70從哪裏來? – phyrrus9

+0

對不起。我不認爲這個觀點正確。我需要它從長度= 1到長度= len找到所有字符串。這包括(比如len = 5)「a」和「aaaaa」。 – phyrrus9

+0

然後你可以在循環中運行'all_combinations'作爲最後一個參數'1,2,..,len'。 – zoska