Arreglos,punteros y sprintf.-

Iniciado por DanielPy, 12 Diciembre 2013, 21:46 PM

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

DanielPy

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.-



#include <stdio.h>

#define MAX 30

int main(void){
char nombre_completo[93], *ptrNC = nombre_completo,
primer_nombre[MAX+1], *ptrPN = primer_nombre,
segundo_nombre[MAX+1], *ptrSN = segundo_nombre,
apellido[MAX+1], *ptrAP = apellido;
int longitud;

printf("\n\n Ingrese primer nombre.....: ");
fgets(ptrPN, MAX, stdin);
printf("\n Ingrese segundo nombre....: ");
fgets(ptrSN, MAX, stdin);
printf("\n Ingrese apellido..........: ");
fgets(ptrAP, MAX, stdin);

longitud = sprintf(ptrNC, "%s %s %s", ptrPN, ptrSN, ptrAP);

printf("\n El nombre completo es: %s.\n", ptrNC);
printf("\n Total de caracteres..: %d", longitud);

return 0;
}


Saludos.
Daniel

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

xiruko

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:

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


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

Saludos.

DanielPy

Hola xiruko.
Muchas gracias y me complace mucho cuando las respuestas son tan completas.-( detalles del porqué, código, librería(s) ).-

Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

rir3760

Cita de: DanielC# en 12 Diciembre 2013, 21:46 PM
#define MAX 30

int main(void){
char nombre_completo[93], *ptrNC = nombre_completo,
primer_nombre[MAX+1], *ptrPN = primer_nombre,
segundo_nombre[MAX+1], *ptrSN = segundo_nombre,
apellido[MAX+1], *ptrAP = apellido;
int longitud;

printf("\n\n Ingrese primer nombre.....: ");
fgets(ptrPN, MAX, stdin);

/* ... */
}
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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

DanielPy

#4
Hola rir3760.
Gracias por el aporte, evidentemente no me informé lo suficiente sobre el prototipo de fgets.-

Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-