elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  TIP: para limpiar el buffer de entrada
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: TIP: para limpiar el buffer de entrada  (Leído 5,874 veces)
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
TIP: para limpiar el buffer de entrada
« en: 29 Abril 2016, 13:19 pm »

Intentando responder a un post y, como siempre pruebo el código de mi respuesta antes, necesitaba de una forma genérica una instrucción para limpiar el buffer de entrada stdin después de adquirir una cadena de entrada mediante fgets.

fgets, según el largo de la cadena introduce saca de stdin el carácter '\n' o no y si se usa while (getchar() != '\n'); sin que haya un carácter de nueva línea en el buffer el programa se detiene y espera a que el usuario introduzca algo. Y eso no queda bien.. Por otra parte controlar a mano si hay o no un carácter de nueva línea es engorroso y ensucia el código.

Llegué a la siguiente solución. Necesita de la librería string.h.

Código
  1. #include <string.h>
  2.  
  3. #define clrfstr(X) { \
  4.     if(!strchr((X), '\n')) \
  5.         while(getchar() != '\n'); \
  6. }

Esto vacía, o no, stdin dependiendo de si ha la cadena ingresada contiene, o no, el carácter de nueva línea.

El código se debe incluir justo después de fgets o de la función que se haya usado para adquirir la cadena. X es el argumento que representa a la variable cadena adquirida.


En línea

HardForo

Desconectado Desconectado

Mensajes: 219


HardForo.com


Ver Perfil WWW
Re: TIP: para limpiar el buffer de entrada
« Respuesta #1 en: 29 Abril 2016, 14:54 pm »

No se, creo que con esto es suficiente:

Código
  1. #define clrfstr(X) { \
  2.     while(getchar() != '\n'); \
  3. }

Que agrega esa condicion amigo ?


En línea

HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: TIP: para limpiar el buffer de entrada
« Respuesta #2 en: 29 Abril 2016, 16:39 pm »

Fragmento de código que hice como respuesta a un juego de mastermind para responder en otro post. Ofrece la funcionalidad de que mira que la entrada de teclado sea efectivamente un número del mismo número de dígitos que la incógnita a buscar, en este programa es un número de 4 dígitos.
Código
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <string.h>
  4.  
  5. #define clrfstr(X) { \
  6.     if(!strchr((X), '\n')) \
  7.         while(getchar() != '\n'); \
  8. }
  9.  
  10. int validar(char cadena[], size_t sizestr, size_t nelements) {
  11.    int i;
  12.    int ok = 1;
  13.  
  14.    for(i = 0; i<4 && ok; i++)
  15.        ok = isdigit(cadena[i]);
  16.    if(cadena[nelements] != '\n')
  17.        ok = 0;
  18.  
  19.    return ok;
  20. }
  21.  
  22. int main() {
  23.    const char incognita[] = "1234";
  24.    const int intentos = 10;
  25.    char entrada[sizeof incognita + 1];
  26.    int i;
  27.    int ganador = 0;
  28.  
  29.    for(i = 0; i < intentos && !ganador; ++i) {
  30.        printf("%03i > ", i+1);
  31.        fgets(entrada, sizeof entrada, stdin);
  32.        clrfstr(entrada);
  33.        if(!validar(entrada, sizeof entrada, strlen(incognita)))
  34.            printf("<<< ERROR >>>\n\n");
  35.        else
  36.            ganador = 1;
  37.    }
  38.  
  39.    return 0;
  40. }
  41.  

Prueba a introducir valores de diferentes cantidades de dígitos, p.ej: 1234, 12, 123456...
ahora borra, o comenta, la línea 6
Código:
if(!strchr((X), '\n')) \
y vuelve a probar otra vez. Se ve claramente la diferencia del comportamiento del programa.
« Última modificación: 29 Abril 2016, 16:58 pm por MAFUS » En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: TIP: para limpiar el buffer de entrada
« Respuesta #3 en: 29 Abril 2016, 18:56 pm »

Hola.
Si sirve de algo dejo la manera que yo utilizo para lograr más o menos lo mismo. -

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main( void ){
  5. char a[5], *p = NULL;
  6. size_t ch;
  7.  
  8. printf( "\n Ingrese una frase...:" );
  9. fgets( a, 5, stdin );
  10. if((p=strchr(a, '\n'))){
  11. *p='\0';
  12. }
  13. else{
  14. while((ch = getchar()) !='\n' && ch!=EOF);
  15. }
  16.  
  17. printf("\n %s", a);
  18.  
  19. return 0;
  20. }




Saludos.
En línea

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.-
HardForo

Desconectado Desconectado

Mensajes: 219


HardForo.com


Ver Perfil WWW
Re: TIP: para limpiar el buffer de entrada
« Respuesta #4 en: 29 Abril 2016, 19:33 pm »

Ya veo.

Ando disperso..... pero el codigo de @Daniel me ayudo a entender lo que comentas @MAFUS  :xD


En línea

HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Solucionado] Problema con lista enlazada en C (buffer de entrada) « 1 2 »
Programación C/C++
xassiz~ 12 10,067 Último mensaje 21 Febrero 2011, 22:22 pm
por xassiz~
Limpiar Buffer en Linux (estructuras)
Programación C/C++
dalberto9410 7 5,189 Último mensaje 26 Marzo 2013, 17:25 pm
por dalberto9410
sobre la entrada GHOST: glibc: buffer overflow en gethostbyname CVE-2015-0235
Seguridad
1quark1 5 2,866 Último mensaje 7 Febrero 2015, 20:53 pm
por .(sWeEtHaCk).
¿Queda algo en el Buffer de Entrada stdin? (Solucionado) « 1 2 »
Programación C/C++
AlbertoBSD 11 4,868 Último mensaje 7 Diciembre 2018, 09:46 am
por MAFUS
funcion limpiar buffer de teclado
Programación C/C++
Locura_23 8 8,602 Último mensaje 15 Octubre 2021, 23:57 pm
por RayR
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines