Imprimir una cadena con puntero sin utilizar un bucle.

Iniciado por Dano1952, 31 Mayo 2018, 20:53 PM

0 Miembros y 1 Visitante están viendo este tema.

Dano1952

Hola ¿como están? .
Tengo una dificultad en este programita que por mas que repaso manuales y busco en la web no logro dar con la tecla, mi pregunta es porque no puedo imprimir la frase invertida con un simple printf %s,

#include <stdio.h>
#include <string.h>

int main(void){
char cadena[]="Rosa y Yiyi", tmp[12]="";
char *p = cadena;
char *t = tmp;
int i, j, lar;

printf ( "\n %s\n", p );
lar = strlen(p);

for (i=lar,j=0; i>=0; i--,j++){
*(t+j) = *(p+i);
}

for (i=0; i<=lar; i++){
printf ( "%c", *(t+i) );
}

printf ( "\n" );

return 0;
}


Esta parte es la que quiero reemplazar y no lo logro.
for (i=0; i<=lar; i++){
printf ( "%c", *(t+i) );
}


Me podrían decir donde estoy fallando?

Dano.

MAFUS

Usa recursión:
Haz una función que reciba una dirección de memoria a un char. Haz que si la actual posición tenga algo (no sea '\0') se llame a si misma pero con la siguiente posición a la recibida y después escriba el carácter que hay en la posición actual. Si no hay nada (hay un '\0') simplemente que regrese.

Llamando a esta función con una cadena la escribirá al revés.

Dano1952

Gracias por responder, de acuerdo, una sola cosita mas, no podes darme algo de teoría de porque no se puede.

Saludos.

Serapis

Claro.
Es cosa del diseño, directamente no se puede imprimir toda la cadena al revés, porque no está implementada dicha función de forma nativa.

Un string se compone de muchos caracteres. Luego cuando se manda imprimir, (a bajo nivel) se imprime de uno en uno. Cualquier función que imprime una cadena en cualquier lenguaje siempre usa un bucle, imprimiendo uno a uno los caracteres...

Qué problema tienes en recorrer el bucle desde el final al principio, imprimiendo cada vez un carácter...?.

Crea una funcion, que haga lo mismo pero al revés, la llamas printReversef, la invocas igual que printf y listo...


funcion PrintReverse(char[] Cadena, otros parametros que quieras usar)
    entero j, k
   
    j = tamaño de Cadena

    bucle para k desde j-1 hasta 0 retrocediendo
        imprimr caracter cadena[k]
    fin bucle
fin funcion


No veo necesario que hagas un réplica del contenido... solo imprime carácter a carácter, pero empezando por el final y retrocedeidno.

Hacerlo recursivo, en vez de iterativo, consume más recursos y es más lento, y para algunos menos evidente su funcionamiento (básicamente no queda tan claro cuando finaliza, como un bucle for).

MAFUS

Bueno, lo hice iterativo por petición suya de no usar bucles, o eso creí haber leído en el momento de dar respuesta.

Serapis

Claro, Mafus... yo entendí en primer lugar lo mismo...

...al final me quedó claro, que su problema era que no entendía el funcionamiento, de la función, que de alguna manera ve la función como una instrucción atómica de un único paso.

Dano1952

Sólo si estuvieran sentado frente a mi compu notarían la satisfacción que me causo la explicación de Ud. todo perfecto todo entendido, todo claro.- ;-) ;-) ;-)
Dano.