Programación General > C/C++
[C] fgets y línea innecesaria [Solucionado]
Amphoth3ra:
Estoy practicando un poco de fgets con cadenas y me he encontrado con algo bastante extraño, que consiste en que las cadenas que yo entrego de entrada, me salen correctas, pero me salen con una línea de más.
Les explico con código en mano. Esta aplicación pretende guardar en una estructura temporal cuatro datos
1) El nombre de un DVD
2) El género de un DVD
3) El número de discos de un DVD
4) La duración total del DVD en minutos
--- Código: C ---#include<stdio.h>#include<stdlib.h>#include<string.h> struct dvd { char name[255]; char genero[50]; int discs_number; int length;}; int main(){ struct dvd temporal; char discs_number[2]; char length[4]; printf("Nombre del DVDn"); fgets(temporal.name, 255, stdin); printf("%sn", temporal.name); printf("Género del DVDn"); fgets(temporal.genero, 50, stdin); printf("%sn", temporal.genero); printf("Número de discos del DVDn"); fgets(discs_number, 2, stdin); temporal.discs_number = atoi(discs_number); printf("%dn", temporal.discs_number); printf("Duración del DVDn"); while(getchar() != 'n'); fgets(length, 4, stdin); temporal.length = atoi(length); printf("%dn", temporal.length); return(0);}
Cuando ejecuto el programa, si introducen el nombre del DVD, la cadena que se me regresa es correcta cuando yo haga el printf, pero automáticamente se me salta una línea. Lo mismo pasa con el género del DVD.
Los campos de número de discos y de duración del DVD funcionan correctamente.
Pruébenlo con estos datos:
Nombre: Batman
Género: Acción
Número de discos: 1
Duración; 126
¿Que puede estar pasando? (por cierto, mi código está compilado con GCC)
Saludos!
su -:
fgets toma todo el contenido de la linea, incluyendo el fin de linea (el "n" cunado presionas enter).
Amphoth3ra:
De esto deduzco que el fgets no me servirá si lo que quiero es poner todos los datos de la estructura en una sola línea, ya que para los campos 1 y 2 me toma el fin de la línea.
Me explico, lo que yo quiero es que los datos de la estructura se puedan imprimir así:
Batman Acción 1 126
Pero en realidad ahora se imprimen así:
Batman
Acción
1 126
¿Existe otra manera de que yo pueda guardar el string sin el salto de línea?
Saludos!
ProfesorX:
--- Cita de: "Amphoth3ra" ---¿Existe otra manera de que yo pueda guardar el string sin el salto de línea?
--- Fin de la cita ---
Bueno, podrias usar la funcion strchr() para buscar el caracter de salto de linea, y reemplazarlo con el caracter de fin de cadena. De esa manera te evitarias ese problema. A continuacion te dejo el codigo de como hacerlo:
--- Código: C++ --- #include<cstdio>#include<cstdlib>#include<cstring> struct dvd { char name[255]; char genero[50]; int discs_number; int length;}; int main(){ struct dvd temporal; char discs_number[2]; char length[4]; char *pch; printf("Nombre del DVDn"); fgets(temporal.name, 255, stdin); // Buscas la posicion del caracter nueva linea (10) en la cadena pch = strchr(temporal.name, 10); // Si la encontro, reemplazas nueva linea con nulo, que es el fin // de cadena ('') if (pch != NULL) { *pch = ''; } printf("%sn", temporal.name); printf("Género del DVDn"); fgets(temporal.genero, 50, stdin); pch = strchr(temporal.genero, 10); if (pch != NULL) { *pch = ''; } printf("%sn", temporal.genero); printf("Número de discos del DVDn"); fgets(discs_number, 2, stdin); temporal.discs_number = atoi(discs_number); printf("%dn", temporal.discs_number); printf("Duración del DVDn"); while(getchar() != 'n'); fgets(length, 4, stdin); temporal.length = atoi(length); printf("%dn", temporal.length); printf("%s %s %d %d", temporal.name, temporal.genero, temporal.discs_number, temporal.length); return(0);}
Ojala se adapte a lo que necesitas.
Saludos :)
Amphoth3ra:
Funcionó perfecto men, era justo lo que necesitaba, muchas gracias =)
Saludos!
Navegación
[#] Página Siguiente
Ir a la versión completa