La idea de do-while es interesante, yo la adapté de la siguiente manera para crear un código más breve. La idea es empezar por el último carácter (no nulo) de la cadena y comparar con el siguiente. Si son diferentes, imprimir, sino, retroceder un carácter. En la función
start es un apuntador al inicio de la cadena (para saber cuando detenernos al retroceder), c_ptr es un apuntador al carácter actualmente analizado (empezando por el último). La variable interna c funciona como auxiliar para almacenar el valor del carácter siguiente al apuntado por c_ptr.
Programa principal:
Salida en pantalla:
Intro cadena: aaabbbccdddeeee
Salida:edcba
Código (cpp) [Seleccionar]
void elimina_repetido2( char *start, char *c_ptr )
{
static char c = '\0';
if ( c_ptr == start || *c_ptr == '\0' )
return;
else {
if ( *c_ptr != c ) printf( "%c", *c_ptr );
c = *c_ptr;
c_ptr--;
elimina_repetido2( start, c_ptr );
}
}
start es un apuntador al inicio de la cadena (para saber cuando detenernos al retroceder), c_ptr es un apuntador al carácter actualmente analizado (empezando por el último). La variable interna c funciona como auxiliar para almacenar el valor del carácter siguiente al apuntado por c_ptr.
Programa principal:
Código (cpp) [Seleccionar]
#include <cstdio>
#include <cstring>
#include <iostream>
int main(void) {
char s1[100];
cout << "Intro cadena: ";
cin >> s1;
cout << endl << "Salida:";
elimina_repetido2( s1, s1 + strlen(s1) - 1 );
cout << endl;
return 0;
}
Salida en pantalla:
Intro cadena: aaabbbccdddeeee
Salida:edcba