Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Dano1952 en 31 Mayo 2018, 20:53 pm



Título: Imprimir una cadena con puntero sin utilizar un bucle.
Publicado por: Dano1952 en 31 Mayo 2018, 20:53 pm
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,

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main(void){
  5. char cadena[]="Rosa y Yiyi", tmp[12]="";
  6. char *p = cadena;
  7. char *t = tmp;
  8. int i, j, lar;
  9.  
  10. printf ( "\n %s\n", p );
  11. lar = strlen(p);
  12.  
  13. for (i=lar,j=0; i>=0; i--,j++){
  14. *(t+j) = *(p+i);
  15. }
  16.  
  17. for (i=0; i<=lar; i++){
  18. printf ( "%c", *(t+i) );
  19. }
  20.  
  21. printf ( "\n" );
  22.  
  23. return 0;
  24. }

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

Me podrían decir donde estoy fallando?

Dano.


Título: Re: Imprimir una cadena con puntero sin utilizar un bucle.
Publicado por: MAFUS en 31 Mayo 2018, 22:58 pm
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.


Título: Re: Imprimir una cadena con puntero sin utilizar un bucle.
Publicado por: Dano1952 en 1 Junio 2018, 00:34 am
Gracias por responder, de acuerdo, una sola cosita mas, no podes darme algo de teoría de porque no se puede.

Saludos.


Título: Re: Imprimir una cadena con puntero sin utilizar un bucle.
Publicado por: Serapis en 1 Junio 2018, 04:00 am
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...

Código:
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).


Título: Re: Imprimir una cadena con puntero sin utilizar un bucle.
Publicado por: MAFUS en 1 Junio 2018, 07:28 am
Bueno, lo hice iterativo por petición suya de no usar bucles, o eso creí haber leído en el momento de dar respuesta.


Título: Re: Imprimir una cadena con puntero sin utilizar un bucle.
Publicado por: Serapis en 1 Junio 2018, 15:07 pm
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.


Título: Re: Imprimir una cadena con puntero sin utilizar un bucle.
Publicado por: Dano1952 en 1 Junio 2018, 17:03 pm
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.