[ Foro de C ]

Problema al leer caracter con scanf en linux

16-May-2011 20:11
Juan Carlos Hernandez L.
1 Respuestas

me he apuntado recientemente al curso y estoy haciendo los ejercicios propuestos pero al llegar al numero 18 que dice: Pida al usuario un número entero y una letra, y muestre en pantalla la letra repetida tantas veces como indique el número. Por ejemplo, si el número es 10 y la letra es a, aparecerí­a
aaaaaaaaaa.
lo he hecho asi:

#include <stdio.h>
int main()
{
   int num,i;
   char c;
   printf("Introduce el numero: ");
   scanf("%d",&num);
   printf("\nIntroduce el caracter: ");
   fflush(stdin);
   scanf("%c",&c);
   for(i=0;i<num;i++)
   {
       printf("%c",c);
   }
   return 0;
}

el programa compila y se ejecuta normalmente lo que pasa es que cuando quiero introducir el caracter no me deja y se termina el programa no se porque. Solo funciona cuando lo leo como %s.esta programado en linux. tendra algo que ver?. espero vuestra ayuda.


21-May-2011 18:45
Nacho Cabanes (+83)

Sí, fflush, que en teoría debería vaciar un buffer (en teoría, en tu caso, stdin, que es la entrada estándar), en ocasiones no funciona bien, y no absorbe esa pulsación de Intro que ha quedado en el buffer del teclado después de la lectura del número.

Ese es el riesgo cuando usas "scanf" para leer caracteres, especialmente si lo mezclas con otras cosas (como con números, en tu caso).

Este problema lo tienes comentado al final del apartado 4 de mi curso:

http://www.aprendeaprogramar.com/mod/resource/view.php?id=320


Se podría solucionar así (por ejemplo):


#include <stdio.h>
int main()
{
   int num,i;
   char c;
   
   printf("Introduce el numero: ");
   scanf("%d",&num);    
   scanf("%c",&c); /* Absorbo el avance de línea */
   
   printf("\nIntroduce el caracter: ");
   scanf("%c",&c);
   
   for(i=0;i<num;i++)
   {
       printf("%c",c);
   }
   return 0;
}

O bien puedes leer toda una cadena con "gets" y extraer su primer carácter.






(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.)