Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: DanielC en 7 Septiembre 2010, 02:12 AM

Título: Sacar con scanf() todo el contenido del buffer del teclado.-
Publicado por: DanielC en 7 Septiembre 2010, 02:12 AM
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
Título: Re: Sacar con scanf() todo el contenido del buffer del teclado.-
Publicado por: SirLanceCC en 7 Septiembre 2010, 03:21 AM
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.
Título: Re: Sacar con scanf() todo el contenido del buffer del teclado.-
Publicado por: DanielC en 7 Septiembre 2010, 03:39 AM
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
Título: Re: Sacar con scanf() todo el contenido del buffer del teclado.-
Publicado por: Darioxhcx en 7 Septiembre 2010, 03:48 AM
si usas gets ?
Título: Re: Sacar con scanf() todo el contenido del buffer del teclado.-
Publicado por: DanielC en 7 Septiembre 2010, 04:01 AM
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
Título: Re: Sacar con scanf() todo el contenido del buffer del teclado.-
Publicado por: leogtz en 7 Septiembre 2010, 04:08 AM
Puedes usar:

#include <stdio.h>
int main(void)
{
char buffer[100];
printf("Cadena : ");
scanf("%100[^\n]", buffer);
printf("Cadena : [%s]\n", buffer);
return 0;
}
Título: Re: Sacar con scanf() todo el contenido del buffer del teclado.-
Publicado por: SirLanceCC en 7 Septiembre 2010, 06:06 AM
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
Título: Re: Sacar con scanf() todo el contenido del buffer del teclado.-
Publicado por: Eternal Idol en 7 Septiembre 2010, 09:25 AM
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.
Título: Re: Sacar con scanf() todo el contenido del buffer del teclado.-
Publicado por: Garfield07 en 7 Septiembre 2010, 11:22 AM
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
Título: Re: Sacar con scanf() todo el contenido del buffer del teclado.-
Publicado por: DanielC en 7 Septiembre 2010, 18:08 PM
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
Título: Re: Sacar con scanf() todo el contenido del buffer del teclado.-
Publicado por: leogtz en 9 Septiembre 2010, 01:33 AM
Return Value

On success, the function returns the number of items succesfully read. This count can match the expected number of readings or fewer, even zero, if a matching failure happens.
In the case of an input failure before any data could be successfully read, EOF is returned.


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