#include <stdlib.h>
#include <conio2.h>

void CrearString(char **str); //Crea un string.
void MostrarString(char *str); //Muestra String
void MostrarStringInvertido(char *str);//Muestra string invertido.

int main()
{
    char *frase=NULL;
    MostrarString("Ingrese una frase:");
    CrearString(&frase);
    MostrarString("La frase ingresada es:");
    MostrarString(frase);
    MostrarString("La frase invertida es:");
    MostrarStringInvertido(frase);
    system("pause");
    return 0;
}

void CrearString(char **texto)
{
    char *aux=NULL, c;  //aux es un puntero auxiliar, c se utilizará de forma auxiliar tambien.
    int tec=0,i, inity=wherey();  //tec representará el número de teclas pulsadas e i es auxiliar.

    while(c=getch(), c!='\r') //Mientras no se pulse enter.
    {
        if(c=='\b') //Si se pulsa backspace, es decir, borrar caracter.
        {
            if(tec>0)
            {
                if(wherex()==1&&wherey()!=inity)
                {
                    gotoxy(80,wherey()-1);
                    putchar(' ');
                    gotoxy(80,wherey()-1);
                }
                else{
                    putchar(c); //Se pone el caracter.
                    putchar(' '); //Se deja un espacio en blanco para "borrar" caracter
                    putchar(c); //Se retorna a la posición donde estaba el caracter que fue borrado.
                }
                tec--; //Se resta 1 al numero de teclas pulsadas.
            }
        }else{
            tec++;   //Se pulsó una tecla.
            putchar(c);  //Se muestra caracter en pantalla.
            aux=*texto;  //aux apunta a texto (notar que texto entró como puntero a puntero para poder editar su dirección)
            *texto=(char*)malloc((tec+1)*sizeof(char)); //Se reserva memoria para caracteres, tec+1 pues debe tener caracter final '\0'.
            (*texto)[tec-1]=c; //El último caracter pulsado se ubica en la posición final del arreglo creado.
            for(i=0;i<tec-1;i++)   //Se le da al resto de los caracteres los valores apuntados por el puntero aux.
                (*texto)[i]=aux[i];
            free(aux);  //se libera la memoria apuntada por aux.
        }
    }
    (*texto)[tec]='\0';
    putchar('\n'); //Se muestra salto de línea en pantalla.
}

void MostrarString(char *str)
{
    int i;  //Variable para recorrer string.
    for(i=0;str[i];i++) //Mientras haya caracteres a leer, se leen 1 por 1.
        putchar(*(str+i)); //Se muestran en pantalla.
    putchar('\n'); //Se imprime en pantalla un salto de línea.
}

void MostrarStringInvertido(char *str)
{
    int i;
    for(i=0;str[i+1];i++); //Se recorre el arreglo hasta antes del caracter nulo.
    for(;i>=0;i--) //Se leen los caracteres de adelante hacia atras para mostrarlos en pantalla.
        putchar(*(str+i));
    putchar('\n'); //Se imprime salto de linea.
}
