Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: DanielPy en 12 Diciembre 2013, 21:46 pm



Título: Arreglos,punteros y sprintf.-
Publicado por: DanielPy en 12 Diciembre 2013, 21:46 pm
Hola a todos.
Estoy estudiando punteros y me encuentro con este inconveniente que no puedo resolver, bueno no les doy más explicaciones porque en la captura queda claro que en la cadena concatenada me está tomando el salto de línea de las cadenas  individuales, eso es lo que deseo resolver.-

(http://i41.tinypic.com/30lkwmd.jpg)

Código
  1. #include <stdio.h>
  2.  
  3. #define MAX 30
  4.  
  5. int main(void){
  6. char nombre_completo[93], *ptrNC = nombre_completo,
  7. primer_nombre[MAX+1], *ptrPN = primer_nombre,
  8. segundo_nombre[MAX+1], *ptrSN = segundo_nombre,
  9. apellido[MAX+1], *ptrAP = apellido;
  10. int longitud;
  11.  
  12. printf("\n\n Ingrese primer nombre.....: ");
  13. fgets(ptrPN, MAX, stdin);
  14. printf("\n Ingrese segundo nombre....: ");
  15. fgets(ptrSN, MAX, stdin);
  16. printf("\n Ingrese apellido..........: ");
  17. fgets(ptrAP, MAX, stdin);
  18.  
  19. longitud = sprintf(ptrNC, "%s %s %s", ptrPN, ptrSN, ptrAP);
  20.  
  21. printf("\n El nombre completo es: %s.\n", ptrNC);
  22. printf("\n Total de caracteres..: %d", longitud);
  23.  
  24. return 0;
  25. }
  26.  

Saludos.
Daniel
(http://i41.tinypic.com/2mhamg9.jpg)


Título: Re: Arreglos,punteros y sprintf.-
Publicado por: xiruko en 12 Diciembre 2013, 23:16 pm
Eso te ocurre porque fgets() también guarda el salto de línea en el bufer que le pases como parámetro.

Una manera de solucionar esto podría ser eliminar el salto de línea '\n' del final de la cadena después de cada fgets(). Por ejemplo:

Código
  1. printf("\n\n Ingrese primer nombre.....: ");
  2. fgets(ptrPN, MAX, stdin); // ptrPN="Pepe\n"
  3. ptrPN[strlen(ptrPN)-1]='\0'; // ptrPN="Pepe"

No te olvides de incluir string.h si usas la función strlen().

Saludos.


Título: Re: Arreglos,punteros y sprintf.-
Publicado por: DanielPy en 13 Diciembre 2013, 14:12 pm
Hola xiruko.
Muchas gracias y me complace mucho cuando las respuestas son tan completas.-( detalles del porqué, código, librería(s) ).-

Saludos.
Daniel
(http://i41.tinypic.com/2mhamg9.jpg)


Título: Re: Arreglos,punteros y sprintf.-
Publicado por: rir3760 en 13 Diciembre 2013, 16:52 pm
Código
  1. #define MAX 30
  2.  
  3. int main(void){
  4. char nombre_completo[93], *ptrNC = nombre_completo,
  5. primer_nombre[MAX+1], *ptrPN = primer_nombre,
  6. segundo_nombre[MAX+1], *ptrSN = segundo_nombre,
  7. apellido[MAX+1], *ptrAP = apellido;
  8. int longitud;
  9.  
  10. printf("\n\n Ingrese primer nombre.....: ");
  11. fgets(ptrPN, MAX, stdin);
  12.  
  13. /* ... */
  14. }
No es necesario declarar los arrays con un carácter adicional ya que al llamar a fgets su segundo argumento indica el numero máximo de caracteres a almacenar y ello incluye el '\0'. En otras palabras los puedes declarar con MAX caracteres sin ningún problema.

Un saludo


Título: Re: Arreglos,punteros y sprintf.-
Publicado por: DanielPy en 13 Diciembre 2013, 17:50 pm
Hola rir3760.
Gracias por el aporte, evidentemente no me informé lo suficiente sobre el prototipo de fgets.-

Saludos.
Daniel
(http://i41.tinypic.com/2mhamg9.jpg)