Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: dalberto9410 en 27 Marzo 2013, 06:07 am



Título: Duda con fgets
Publicado por: dalberto9410 en 27 Marzo 2013, 06:07 am
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
Código:
#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
(http://img716.imageshack.us/img716/2286/xddmn.jpg)
Ojo que con scanf no ocurre eso pero quisiera hacerlo con fgets :/

Gracias de antemano!! Saludos.


Título: Re: Duda con fgets
Publicado por: rir3760 en 27 Marzo 2013, 06:38 am
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:
Código
  1. #include <string.h>
  2.  
  3. /* ... */
  4.  
  5. c_t crear_contacto()
  6. {
  7.   c_t nuevo;
  8.   char *p;
  9.  
  10.   puts("Ingrese nombre:");
  11.   fgets(nuevo.nombre, 80, stdin);
  12.   if ((p = strchr(nuevo.nombre, '\n')) != NULL)
  13.      *p = '\0';
  14.  
  15.   puts("Ingrese telefono:");
  16.   scanf("%d", &nuevo.tel);
  17.  
  18.   nuevo.fecha_nacimiento = crear_fecha();
  19.  
  20.   return  nuevo;
  21. }

Un saludo


Título: Re: Duda con fgets
Publicado por: dalberto9410 en 27 Marzo 2013, 06:45 am
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


Título: Re: Duda con fgets
Publicado por: rir3760 en 27 Marzo 2013, 06:55 am
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?
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'.
 
Ah 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:
Código
  1. printf("hola, mundo\n");
Podemos utilizar con el mismo efecto (nos ahorramos el '\n'):
Código
  1. puts("hola, mundo");

Un saludo


Título: Re: Duda con fgets
Publicado por: dalberto9410 en 27 Marzo 2013, 07:27 am
Gracias rir3760 no sabia que existia "Puts" yo siempre usaba salto de línea '\n' ....
joder con esto me ahorro mucho xD  ;-) ;-) ;-)