2017-09-24 53 views
-2

我想創建一個程序,打印每個可能的字符串,並以任意最大長度的字符'a'開始。對於這個例子,我們將使用最大長度爲4.遞歸函數似乎是一個很好的方式來處理這個問題,但是我現在非常困惑,爲什麼遞歸函數不會打印例如「ab」?看起來循環在再次調用遞歸之後不會繼續。C:打印以'a'開始的每個可能的字符串,遞歸函數

int main() 
{ 
    char *str = malloc(5* sizeof(char)); 
    str[0] = 'a'; 
    recursive(str, 1); 
} 

void recursive(char *string, int index) 
{ 
    // Max length of 4 
    if (index > 3) 
     return; 

    for(char c = 'a'; c <= 'j'; c++) 
    { 
     string[index] = c; 
     printf("str: %s\n", string); 

     recursive(string, index + 1); 
    } 
} 

雖然結果是接近我想要的東西,注意有沒有「AB」,「AC」,「ABC」,「ACB」,長度爲2或3(除AA基本上所有字符串/ AAA)。長度4(最大)的每個組合都被打印。

the result

什麼辦法解決呢?謝謝!

+0

你'aabj'和印刷至少兩次'aacj',所以是你必須調試別的東西。 –

回答

1

算法或遞歸沒有任何問題。您唯一需要的是在遞歸步驟完成之後縮短字符串(字符串在C中爲ASCIIZ)。

修復的方法是簡單的:你需要確保有你分配的內存塊,這是通過使用memset(內存塊其指針由malloc返回包含垃圾)清除其內容做零。

int main() 
{ 
    size_t size = 5; 
    char* str = (char*)malloc(size); 
    memset(str, 0, size); 
    str[0] = 'a'; 
    recursive(str, 1); 
} 

然後在你的循環:

for (char c = 'a'; c <= 'j'; c++) 
{ 
    string[index] = c; 
    printf("str: %s\n", string); 

    recursive(string, index + 1); 

    string[index] = 0; // <-- revert last letter to zero 
} 
+0

非常感謝您的回答,它似乎完美地工作!我看到你也改變了我的主要功能,雖然我不明白爲什麼? – SJ19

+0

您需要確定'malloc'返回的內存塊中有零。我編輯了我的答案。 – vasek

+0

memset(str,0,size);確保只有0?如果情況並非如此,會發生什麼?另外,我的結果如何出現重複? – SJ19