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
}