elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda con fgets
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda con fgets  (Leído 3,087 veces)
dalberto9410

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Duda con fgets
« 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 anio; }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.anio); 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.anio);

return 0; }
Aca el resultado de la salida

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

Gracias de antemano!! Saludos.


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Duda con fgets
« Respuesta #1 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


En línea

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

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: Duda con fgets
« Respuesta #2 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
« Última modificación: 27 Marzo 2013, 06:49 am por dalberto9410 » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Duda con fgets
« Respuesta #3 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
En línea

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

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: Duda con fgets
« Respuesta #4 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  ;-) ;-) ;-)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con fgets [Solucionado]
Programación C/C++
Søra 0 2,048 Último mensaje 22 Mayo 2010, 12:15 pm
por Søra
Duda con buffer utilizado para leer con fgets()
Programación C/C++
Gabilan81 1 2,739 Último mensaje 25 Septiembre 2010, 22:48 pm
por Ca0s
Problema con fgets
Programación C/C++
P.AGCD 3 3,889 Último mensaje 14 Julio 2011, 20:41 pm
por kiriost
No me reconoce función fgets
Desarrollo Web
..:ALT3RD:.. 4 2,897 Último mensaje 23 Agosto 2013, 19:25 pm
por ..:ALT3RD:..
Duda sobre fgets() en c
Programación C/C++
lgamerm 8 5,433 Último mensaje 26 Octubre 2016, 06:34 am
por lgamerm
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines