Duda con fgets

Iniciado por dalberto9410, 27 Marzo 2013, 06:07 AM

0 Miembros y 2 Visitantes están viendo este tema.

dalberto9410

Hola, aquí yo de nuevo xD ayer puse una duda que tenia y se resolvia usando fgets allí todo bien pero he estado probando y cuando uso fgets se salta una linea

#include<stdio.h>
typedef struct fecha{int dia;int mes;int año; }d_t;
typedef struct contacto{char nombre[80];unsigned int tel; d_t fecha_nacimiento; }c_t;

d_t crear_fecha(){   d_t nueva_fecha;
printf("\nIngrese el dia: "); scanf("%d",&nueva_fecha.dia);  while(getchar()!='\n');
printf("\nIngrese mes: ");    scanf("%d",&nueva_fecha.mes);  while(getchar()!='\n');
printf("\nIngrese año:" );    scanf("%d",&nueva_fecha.año); while(getchar()!='\n');
return nueva_fecha;        }

c_t crear_contacto(){  c_t nuevo_contacto;
printf("\nIngrese nombre: ");
fgets(nuevo_contacto.nombre,80,stdin);
//scanf("%[^\n]s",nuevo_contacto.nombre);
printf("\nIngrese telefono: ");  scanf("%d",&nuevo_contacto.tel);
//asignar fecha de nacimiento
nuevo_contacto.fecha_nacimiento=crear_fecha();
return  nuevo_contacto;   }

c_t imprimir(){

}
int main (void){   c_t c1;
c1=crear_contacto();
imprimir(c1);

printf("Nombre: %s, Telefono %d, Fecha Nacimiento: %d/%d/%d",
c1.nombre,c1.tel,c1.fecha_nacimiento.dia,c1.fecha_nacimiento.mes,c1.fecha_nacimiento.año);

return 0; }

Aca el resultado de la salida

Ojo que con scanf no ocurre eso pero quisiera hacerlo con fgets :/

Gracias de antemano!! Saludos.

rir3760

Lo que indicas es normal ya que fgets lee y almacena una linea de texto incluyendo el avance de linea. Si no quieres el '\n' debes eliminarlo manualmente mediante un bucle o utilizando la función strchr (prototipo en <string.h>), como hacerlo con esta ultima:
#include <string.h>

/* ... */

c_t crear_contacto()
{
   c_t nuevo;
   char *p;
   
   puts("Ingrese nombre:");
   fgets(nuevo.nombre, 80, stdin);
   if ((p = strchr(nuevo.nombre, '\n')) != NULL)
      *p = '\0';
   
   puts("Ingrese telefono:");
   scanf("%d", &nuevo.tel);
   
   nuevo.fecha_nacimiento = crear_fecha();
   
   return  nuevo;
}


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

dalberto9410

#2
Ya probé el codigo que me diste y lo entendi según lo poco que sé,creo que allí lo que estas haciendo es crear una variable p que es un puntero y coje la direccion donde encuentre un salto de linea y lo remplace por '\0' no?
Ah y otra cosa como es el funcionamiento de puts? me podrías explicar D:
Graax por responder :D

rir3760

Cita de: dalberto9410 en 27 Marzo 2013, 06:45 AMcreo que allí lo que estas haciendo es crear una variable p que es un puntero y coje la direccion donde encuentre un salto de linea y lo remplace por '\0' no?
Correcto. Utilizamos strchr para buscar el '\n' en la cadena y almacenamos su resultado en la variable "p". Si es NULL significa que no se encontró, si es distinto entonces esa es la dirección en la cadena donde se almacena el carácter. En este punto basta con utilizar "*p = '\0'" para sobrescribir el '\n' con un '\0'.

Cita de: dalberto9410 en 27 Marzo 2013, 06:45 AMAh y otra cosa como es el funcionamiento de puts?
Es una función simple, imprime la cadena pasada como argumento y a continuación imprime un avance de linea. Por ejemplo en lugar de:
printf("hola, mundo\n");
Podemos utilizar con el mismo efecto (nos ahorramos el '\n'):
puts("hola, mundo");

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

dalberto9410

Gracias rir3760 no sabia que existia "Puts" yo siempre usaba salto de línea '\n' ....
joder con esto me ahorro mucho xD  ;-) ;-) ;-)