[ Foro de C ]

Ejercicio 5.5.2

24-Jul-2014 11:22
Invitado (Sergio)
2 Respuestas

Tengo un problema en esta ejercicio ya que al introducir mas de una palabra en la parte de artista o titulo se me salta una o dos lineas impidiendo introducir los dos datos siguientes.
Por ahora solo me interesa ese fallo.¿alguna opcion para solucionarlo?


#include <stdio.h>
#include <string.h>

int main () {
	struct {
		char artista[50];
		char titulo[50];
		double dseg;
		double tam;
	}ncancion[100], canciones[100];
	
	char o,buscar[50];
	int i,j,k,l,m,x,y;
	
	printf ("\nPulse N para a¤adir nueva cancion.\n");
	printf ("\nPulse M para mostrar los titulos de las canciones.\n");
	printf ("\nPulse B para buscar un artista o un titulo.\n");
	
	menu:
		printf ("\nIntroduce la opcion a realizar: ");
		o = getchar ();
	
	switch (o){
		case 'N': printf ("\nCuantas canciones se van aniadir?(max. 100): ");
				  scanf ("%d",&x);
				  
				  for (i = 0; i < x; i++) {
				  	printf ("\nEscribe el nombre del artista: ");
					gets (canciones[i].artista);
					printf ("\nEscribe el nombre del titulo: ");
					gets (canciones[i].titulo);
					printf ("\nIntroduce la duracion en segundos: ");
					scanf ("%lf",&canciones[i].dseg);
					printf ("\nIntroduce el tama¤o de la cancion: ");
					scanf ("%lf",&canciones[i].tam);
				  }
				
				  goto menu; break;
				  
		case 'M': printf ("\nLos titulos de las canciones son: ");
		
				  for (j = 0; j <= 100; j++){
				  	printf ("\n%s.",canciones[i-1].titulo);
				  }
				  
				  goto menu;
				  break;
				  
		case 'B': printf ("\nIntroduce un artista o titulo a buscar: ");
				  scanf ("%s",buscar);
				  
				  for (k =0; k <= 100; k++) {
				  	i = 0;
				  	y = strstr(buscar[50], canciones[i].artista);
				  	i++;
				  }
				  
				  if (y != 0) {
				  	printf ("\nEl artista NO esta en la lista.");
				  }
				  if (y == 0) {
				  	("\nEl artista esta en la lista.");
				  }
				  
				  for (k =0; k <= 100; k++) {
				  	i = 0;
				  	y = strstr(buscar[50], canciones[i].titulo);
				  	i++;
				  }
				  
				  if (y != 0) {
				  	printf ("\nEl titulo NO esta en la lista.");
				  }
				  else if (y == 0) {
				  	("\nEl titulo esta en la lista.");
				  }
				  
				  goto menu;
				  break;
				  
		default: goto menu; break;



24-Jul-2014 15:18
Luis Torres (+18)

Eso sucede mucho cuando se programa en lenguaje C, se debe a que cuando se produce una entrada de datos quedan parte de esos datos en el buffer de entrada. La solución es vaciar el buffer de entrada antes de leer el siguiente dato. Una instrucción muy útil para hacer esta tarea es la siguiente:


while(getchar()!='\n');


No necesitas usarla cada vez, sino en aquellas partes del código en la que se te da el problema. En tu caso, sería en aquí:


case 'N': printf ("\nCuantas canciones se van aniadir?(max. 100): "); 
 scanf ("%d",&x); 
while(getchar()!='\n');
  
 for (i = 0; i < x; i++) { 
 	printf ("\nEscribe el nombre del artista: "); 
gets (canciones[i].artista); 
printf ("\nEscribe el nombre del titulo: "); 
gets (canciones[i].titulo); 
printf ("\nIntroduce la duracion en segundos: "); 
scanf ("%lf",&canciones[i].dseg); 
printf ("\nIntroduce el tama¤o de la cancion: "); 
scanf ("%lf",&canciones[i].tam); 
 } 


Fíjate que con el "scanf" lees primero un número. Cuando el usuario termina de escribir ese número pulsa la tecla "Enter", entonces en la variable "x" quedará guardado el número, pero en el buffer de entrada se quedará el "Enter", entonces cuando haces la siguiente lectura (gets(canciones[i].artista)) el valor "Enter" se guardará automáticamente allí, porque eso es lo que encuentra en el buffer de entrada, allí se produce la acción indeseada, y es en ese intermedio en el que deberás limpiar el buffer de entrada.


24-Jul-2014 15:26
Invitado (Sergio)

Gracias por la respuesta llevo unos meses aprendiendo por mi cuenta y todavia hay cosas que no se y que espero aprender pronto






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)