Печать цепи символов наоборот в C

Мое сомнение главным образом с функцией reverse, проблема состоит в том, что я не разбираюсь в каком моменте, или как он состоит в том, что он реализует вложение цепи символов.

А именно, каждое из решений по отдельности я понимаю их, больше не полная функция. Я надеюсь, что они могут объяснять мне.

include <stdio.h>
include <conio.h>
include <stdlib.h>
include <string.h>
include <ctype.h>
include <math.h>
include <time.h>

void reverse(const char *const sPtr);

int main()
{
    char sentence[80];

    printf("Enter a line of text:\n");

    fgets(sentence, 80, stdin);

    printf("\nThe line printed backwad is:\n");
    reverse(sentence);

    getch();
    return 0;
}

void reverse(const char *const sPtr)
{
    if(sPtr[0] == '\0')
    {
        return;
    }
    else
    {
        reverse(&sPtr[1]);
        putchar(sPtr[0]);
    }
}
3
задан 11.01.2017, 00:50
0 ответов

Представь, что sentence[0] будь в адресе памяти 0x10. И который он содержит "JML".

&variable[0] это адрес памяти первого элемента array; с которым &sentence[0] он 0x10.
И &sentence[1] он 0x11

Memoria :
0x10 0x11 0x12 0x13
 J     L    M   \0

reverse( sentence )  -> sentence es la dirección 0x10
  |- recibimos sPtr=0x10
  |- en 0x10 no hay '\0' luego llama a :
  |- reverse( &sPtr[1] ) -> &sPtr[1] es la dirección 0x11
  |   |- recibimos sPtr=0x11; este sPtr es uno distinto del de la función que nos ha llamado 
  |   |- en 0x11 no hay '\0' luego llama a :
  |   |- reverse( &sPtr[1] ) -> &sPtr[1] es la dirección 0x12
  |   |    |- recibimos sPtr=0x12
  |   |    |- en 0x12 no hay '\0' luego llama a :
  |   |    |- reverse( &sPtr[1] ) -> &sPtr[1] es la dirección 0x13
  |   |    |     |- recibimos sPtr=13
  |   |    |     \- en 0x13 sí hay '\0' luego volvemos
  |   |    \- imprimir carácter en sPtr[0]; recordar que sPtr=0x12; el caracter es 'M'
  |   \- imprimir carácter en sPtr[0]; recordar que sPtr=0x11; el caracter es 'L' 
  \-imprimir carácter en sPtr[0]; recordar que sPtr=0x10; el caracter es 'J'

Поскольку ты видишь функцию, он называет самого себя перекурсивной формы перемещая себя каждый раз больший адрес цепи символов до тех пор, пока он не прибывает к завершающему '\0'. И потом возвратись в предыдущий вызов и печатай символы.

2
ответ дан 03.12.2019, 17:46
void reverse(const char *const sPtr)
{
    if(sPtr[0] == '\0')
    {
        return;
    }
    else
    {
        reverse(&sPtr[1]);
        putchar(sPtr[0]);
    }
}

Если указатель, перемещенный за аргумент == 0 (конец цепи), закончись.

В другом случае, пламени recursivamente в саму функцию reverse( ) и, возвратившись этого так называемого переиталика, покажи характер, на который он указывает sPtr.

Эти так называемые переиталики в саму функцию reverse( ) это запутанный способ это делать, печатать цепь наоборот. Каждый новый вызов делается перемещая как аргумент адрес, следующий за настоящей, на которую он указывает sPtr:

1ª llamada -> sPtr = cadena[0];
2ª llamada -> sPtr = cadena[1];
3ª llamada -> sPtr = cadena[2];

Когда ты прибываешь в конце цепи, if == '\0' отрежь возврат. Тогда, он, когда осуществляется вызов в putchar( ), что печатает характер. Первый раз, который называется в putchar( ), он, потому что мы в cadena[strlen(cadena)-1].

Сейчас, в каждом возврате, мы печатаем характер, предыдущий последнему, что мы печатаем.

Я ИЗДАЮ

Посмотрим так останься более ясным:

В каждом призыве в reverse( ), мы продвигаемся из-за цепи. В каждом возврате, мы печатаем характер.

Так как никогда мы не возвращаемся перед тем, как прибывать в конце концов, первый возврат делается, когда мы справедливые в конце концов, и это первое, что печатается, последний характер.

Второй возврат, напечатай предпоследний характер.

И так, в каждом возврате мы печатаем предыдущий характер, до тех пор, пока мы не прибываем в последний возврат, который печатает первый характер.

Что-то запутанное, но простое.

3
ответ дан 03.12.2019, 17:46