Получение ввода с помощью fgets и вывод ответа в обратном порядке с помощью рекурсии - PullRequest
0 голосов
/ 31 декабря 2018

Это образец фрагмента из книги.Я не понимаю, как это печатать строку в обратном порядке.При первом вызове reverse элемент в 0 не является нулевым, если, конечно, была введена правильная строка.В операторе else мы снова вызываем функцию, передавая адрес элемента с индексом 1.

Итак, допустим, я ввел "hello".Тогда я передаю адрес e.Второй раз reverse называется, однако, как проходит строка?Проверяемый индекс по-прежнему равен 1. Кроме того, мне кажется, мы не заменяем значения массива.Когда мы начинаем печатать значения с putchar, я так растерялся, что значение с индексом 0 начинается с последнего элемента массива.Я понимаю, что когда мы используем рекурсию и достигаем базового случая, и поскольку элементы помещаются в стек, мы начинаем читать их с вершины указателя стека до конца, поэтому обратное.Но здесь я не вижу, что происходит.

Жестко закодированные индексы на

reverse( &ptr[1]);
putchar(ptr[0]);

не имеют смысла для меня.Я думаю, мне трудно увидеть, как проходит строка, когда каждый раз в рекурсии передается один и тот же адрес.Пожалуйста, помогите мне понять, что происходит.

Я немного изменил код для простоты, но он делает то же самое, что и в книге.

#include <stdio.h>

void reverse(char * ptr);

int main(){
    char sentence[10];
    printf("enter text \n");
    fgets(sentence, 10, stdin);
    printf("The line is: \n");
    reverse(sentence);
    return 0;
}

void reverse( char * ptr){
    if(ptr[0] == '\0'){
        return;
    } else{
        reverse( &ptr[1]);
        putchar(ptr[0]);
        printf("\n");
    }
}

1 Ответ

0 голосов
/ 31 декабря 2018

&ptr[1] эквивалентно ptr + 1.Теперь, если вы думаете о ptr как о числе (что на самом деле), должно быть очевидно, что это не то же самое число, которое передается каждый раз, а скорее одно большее для каждого уровня рекурсии.Это в основном передача подстроки, начиная со второго символа, только в C подстрока не является отдельным объектом, а скорее указателем на другую позицию в той же строке.

...