Sacar con scanf() todo el contenido del buffer del teclado.-

Iniciado por DanielC, 7 Septiembre 2010, 02:12 AM

0 Miembros y 2 Visitantes están viendo este tema.

DanielC

Hola a todos.-
Este es mi primer post y como me aburren las presentaciones les dejo algunos datos que pueden interesar a la hora de ayudarme.-
Tengo 58 años y estudio con un manual de deitel & deitel y aprendo con la ayuda invalorable de los foros.-
Bueno al grano, les dejo mi código para que me digan como puedo hacer para salir del bucle, probe de muchas manera pero como desconozco lo que leerá scanf() cuando encuentra el buffer vacio no se que poner para finalizar el while().-

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char frase[20];
   printf("\n\tIngrese una frase con espacios...:");

   while(1)
   {
      scanf("%s",frase);
      printf("\n\t%s\n\t",frase);
   }

   return 0;
}


Espero que me den la respuesta o alguna sugerencia de como solucionar esto.-

Saludos.
Daniel
Abraza las cosas y personas malas como si fueran tu mas preciada joya, Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

SirLanceCC

http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

scanf() devuelve el número de variables leidas, o un número negativo si se alcanza el final del archivo.

quedaría así tu ciclo:

while(scanf("%s",frase) > 0)
   {
      printf("\n\t%s\n\t",frase);
   }


recuerda que while evalúa la condición primero y si resulta verdadera se realiza lo que está entre corchetes.

DanielC

Hola SirLanceCC
Que ilusión me diste, sali disparado a probar tu código pero vaya sorpresa igual no sale del bucle.-

Seguiremos investigando.-

Un gran saludo y gracias por tu tiempo.-

Lenguaje C - Windows XP - Code::Blocks
Abraza las cosas y personas malas como si fueran tu mas preciada joya, Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-


DanielC

Hola
Gracias por tu sugerencia pero para el caso usaría
fgets(cadena, maximo, stdin);
Que me parece perfecta, lo que pasa es que quiero hacerlo con scanf para aprender algo nuevo.-

Saludos.
Daniel
Abraza las cosas y personas malas como si fueran tu mas preciada joya, Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

leogtz

Puedes usar:

#include <stdio.h>
int main(void)
{
char buffer[100];
printf("Cadena : ");
scanf("%100[^\n]", buffer);
printf("Cadena : [%s]\n", buffer);
return 0;
}
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

SirLanceCC

cierto... es que scanf tiene comportamientos que pueden parecer extraños.

Por ejemplo ignora todos los espacios en blanco y saltos de linea antes de leer algo.
El codigo que te puse, funcionaría para leer puros números por ejemplo y cuando alguien ingrese algo que no sea reconocido como tal, terminará el ciclo. También si la entrada estándar la diriges desde un archivo debería funcionar (según yo).

me refiero a cuando lo ejecutas así.
programa.exe < mientrada.txt

Eternal Idol

Lo mejor es NO usar scanf NUNCA, si es para una cadena es preferible solo fgets y si es para leer otras cosas fgets + sscanf.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Garfield07

Yo estoy de acuerdo con Eternal Idol, pues a mi scanf me ha dado muxos problemas. Antes tambien usaba scanf, y gets, pero es mejor fgets....

Saludos


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo

DanielC

Hola a todos.
Estoy anonadado apabullado con tantas respuestas, muchas pero muchas gracias a todos por intentar resolver mi problema.-
Lo de Leo Gutiérrez. también lo tenia y funciona muy bien.-
Solo les pido un esfuercito mas, alguien debe saber que devuelve scanf cuando encuentra el buffer vacio, con eso lo pondría como condición para finalizar el bucle y estaría todo resuelto(algo,algo,algo debe ser).-

Bueno un gran saludo y continuare con el tema, si lo resuelvo yo lo posteo.-

Saludos.
Daniel
Abraza las cosas y personas malas como si fueran tu mas preciada joya, Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-