C: Печать каждой возможной строки, начинающейся с 'a', рекурсивные функции

Я хочу создать программу, которая печатает каждую возможную строку, начинающуюся с символа 'a' с произвольной максимальной длиной. В этом примере мы будем использовать максимальную длину 4. Рекурсивная функция казалась хорошим способом справиться с этим, однако сейчас я в замешательстве, почему рекурсивная функция не печатает, например, "ab"? Кажется, что цикл не продолжается после повторного вызова рекурсивного.

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 (максимальная) печатается все же.

результат

Любой способ решить это? Спасибо!

1 ответ

Решение

Нет ничего плохого в вашем алгоритме или рекурсии. Единственное, что вам нужно, это укоротить строку после завершения шага рекурсии (строки ASCIIZ в C).

Исправление очень простое: вам нужно убедиться, что в выделенном блоке памяти есть нули, что делается путем очистки его содержимого с помощью 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
}
Другие вопросы по тегам