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

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Limpieza de buffer de teclado en lenguaje C.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Limpieza de buffer de teclado en lenguaje C.  (Leído 11,479 veces)
NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Limpieza de buffer de teclado en lenguaje C.
« Respuesta #10 en: 13 Enero 2014, 00:54 am »


Hola.
Por favor me podrían probar el programa para que me digan si encuentran algún    error, estoy totalmente obnubilado y necesito de mentes frescas para que constaten si  definitivamente no los tiene (más allá de que se ingresen  100 dígitos).-
       
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void limpiar(char[], int);
  5.  
  6. int main(void){
  7. unsigned int ok=0, longitud=0, i=0, ch=0;
  8. char numeroChar[100] = "";
  9.  
  10. do{
  11. system("cls");
  12. printf("\n\n Ingrese un entero (maximo 9999)....:");
  13. fgets(numeroChar, 100, stdin);
  14. longitud = strlen(numeroChar);
  15. i=0;
  16. if(longitud >=4){
  17. limpiar(numeroChar, longitud);
  18. }
  19. longitud = strlen(numeroChar);
  20.  
  21. printf("\n\n Ingresaste..: %s", numeroChar);
  22.  
  23. printf("\n\n 0 para continuar otro para salir....:");
  24. scanf("%d" , &ok);
  25. while((ch = getchar()) != '\n');
  26.  
  27. }while(ok==0);
  28.  
  29. return 0;
  30. }
  31.  
  32. void limpiar(char numeroChar[], int longitud){
  33. int i=3;
  34. while(++i < longitud){
  35. if(i==4){
  36. numeroChar[4] = '\0';
  37. }
  38. if(i>4){
  39. numeroChar[i] = ' ';
  40. }
  41. }
  42. }

    Desde ya muchas gracias.-
    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.-
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Limpieza de buffer de teclado en lenguaje C.
« Respuesta #11 en: 13 Enero 2014, 04:35 am »

No eh probado lo de las divisiones.
¿Cuantas la puede abrir?


Yo suelo tener nueve ventanitas con tropecientas pestañitas, lo que me permite comparar códigos o recordar comandos básicos de una manera rápida.

Luego amplio la ventana de trabajo actual y automáticamente se ajusta el tamaño de las demás.

Siento que las imágenes no sean muy buenas peo estoy en el portátil, en el monitor grande lo tienen ocupado en este momento. Pero bueno, como prueba de lo que digo creo que vale.

Se consigue abriendo varios ficheros a la vez y arrastrando pestañas hacia los lados. Simple pero muy eficiente:






Y respecto a NOB2014 recordarle que  se tienen que introducir un máximo de 4 caracteres (9 9 9 9 ). El problema surge al declarar el array con tamaño 5 ya que si se introducen más cifras no caben en el array y toman valores basura. La solución es declarar, como has hecho tú, el array con más cifras por precaución, no sea que se introduzcan más de cuatro y empiece el buffer a llenarse de basura. Ya luego sólo queda limitar el tamaño de la cadena con la introducción del caracter nulo,

Te dejo una muestra:

Citar

Ingrese un entero (maximo 9999)....:123


 Ingresaste..: 123


 0 para continuar otro para salir....:0


 Ingrese un entero (maximo 9999)....:123456789


 Ingresaste..: 1234

 0 para continuar otro para salir....:0


 Ingrese un entero (maximo 9999)....:12


 Ingresaste..: 12


 0 para continuar otro para salir....:0


 Ingrese un entero (maximo 9999)....:12345


 Ingresaste..: 1234

 0 para continuar otro para salir....:


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define N 5
  4.  
  5. int main(void){
  6. unsigned int ok=0, longitud=0, i=0, ch=0;
  7. char numeroChar[100] = "";
  8.  
  9. do{
  10. //system("cls");
  11. printf("\n\n Ingrese un entero (maximo 9999)....:");
  12. fgets(numeroChar, 100, stdin);
  13.                numeroChar[N-1] = '\0';
  14. printf("\n\n Ingresaste..: %s", numeroChar);
  15. printf("\n\n 0 para continuar otro para salir....:");
  16. scanf("%d" , &ok);
  17. while((ch = getchar()) != '\n');
  18. }while(ok==0);
  19. return 0;
  20. }
  21.  

¡¡¡¡ Saluditos! ..... !!!!



« Última modificación: 19 Enero 2014, 14:41 pm por leosansan » En línea

vangodp


Desconectado Desconectado

Mensajes: 455



Ver Perfil
Re: Limpieza de buffer de teclado en lenguaje C.
« Respuesta #12 en: 13 Enero 2014, 06:57 am »

Lo que andaba buscando lo encontre -_-' aun que me costo un poco XD

Es que pulsando ctrl + ratón izquierdo o alt + ratón izquierdo puedo editar varias lineas y eso para mi es una de las mejores funciones. No se por que viene desactivada por defecto.
Ahora codeblocks++ XD
Ya logre configurarlo algo a mi gusto.
si sabes alguna pagina con explicación para mi estaría muy bien.
Saludos 
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Limpieza de buffer de teclado en lenguaje C.
« Respuesta #13 en: 13 Enero 2014, 07:37 am »

Lo que andaba buscando lo encontre -_-' aun que me costo un poco XD
...............................................

Y mucho más que iras encontrando a medida que navegues por las opciones.

Un ejemplo es el modo automático para los bucles y más:




¡¡¡¡ Saluditos! ..... !!!!


En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Limpieza de buffer de teclado en lenguaje C.
« Respuesta #14 en: 13 Enero 2014, 15:12 pm »

Hola.
Excelente simplificaste mucho mi código, muchas gracias.-

Citar
fgets Leerá hasta n-1 caracteres o hasta que lea un retorno de línea (\n).
En este último caso , el carácter de retorno de línea también es leído.-

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


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Limpieza de buffer de teclado en lenguaje C.
« Respuesta #15 en: 19 Enero 2014, 03:22 am »

Cuando ingreso más de 3 cifras todo funciona a la perfección
Porque si introduces como mínimo cuatro caracteres, por ejemplo:
Código:
1234{ENTER}
La función fgets al estar limitada a cinco caracteres (incluyendo el '\0') almacenara los caracteres '1', '2', '3', '4' y '\0' en el array. El carácter '\n' se queda en el bufer de la entrada estándar.

Cuando se ejecuta el bucle:
Código
  1. while ((ch = getchar()) != '\n')
  2.   ;
Este procesa el resto de la linea hasta encontrar el '\n', cuando eso sucede la condición es falsa y causa la terminación del bucle.

Por cierto el bucle esta mal, la variable "ch" debe ser de tipo "signed int" y se debe verificar si el resultado de getchar es EOF. Debería ser:
Código
  1. int ch;
  2.  
  3. /* ... */
  4.  
  5. while ((ch = getchar()) != EOF && ch != '\n')
  6.   ;

pero si ingreso menos de 4 el programa se queda detenido en el bucle while de limpieza de buffer de teclado
Porque en este escenario con un máximo de tres caracteres mas el avance de linea, por ejemplo:
Código:
123{ENTER}
La función fgets almacena todos los caracteres en el array. Cuando se ejecuta el bucle para descartar el resto de la linea no hay tal (por ello se debe teclear una linea adicional).

----

En cuanto al primer programa de vangodp este da la apariencia de no funcionar correctamente, se sostiene porque varios errores se cancelan mutuamente. Por ejemplo si se ejecuta e introduce:
Código:
123{ESPACIO}{ENTER}
Su salida es:
Código:
 Ingrese un entero....:123


 Ingresaste..: 12   -----> longitud = 3

 0 para continuar otro para salir....:
Ello porque el espacio causa que el bucle donde se descarta el resto de la linea se ejecute por lo menos una ves y con ello se pierde el ultimo carácter.

En ese programa se debe considerar que los especificadores "%s" y "%d" descartan el espacio blanco (espacio, tabulador, etc.) y por ello los bucles de soporte no son necesarios. El programa se puede reducir a:
Código
  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5.   char palabra[7];
  6.   int ok;
  7.  
  8.   do {
  9.      puts("Introduce una palabra:");
  10.      if (scanf("%s", palabra) != 1)
  11.         break;
  12.      printf("Ingresaste: %s\n", palabra);
  13.  
  14.      puts("0 para continuar otro para salir:");
  15.   }while (scanf("%d" , &ok) == 1 && ok == 0);
  16.  
  17.   return 0;
  18. }
Sin embargo "%s" se debe evitar ya que tiene el mismo defecto que la función gets (mejor utilizar "%Ns" o bien fgets).

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Limpieza de buffer de teclado en lenguaje C.
« Respuesta #16 en: 20 Enero 2014, 23:37 pm »

.........................
    scanf ..............
..........................


Con toda humildad y respeto, creo que tomas la tangente usando el scanf cuando de lo que se trataba era de cómo actuar ante la función fgets.

Sinceramente espero una aportación tuya que nos saque de la duda, ya que este tema ha surgido en otro tema y nos tiene con soluciones, que si bien hacen correctamente la labor, hecho de menos una solución más elegante y/o simple por parte tuya. Para que veas la alta estima en que te tengo ;)


¡¡¡¡ Saluditos! ..... !!!!



P.D: Otro hilo que trata el tema es error_fgets.
 
« Última modificación: 21 Enero 2014, 16:11 pm por leosansan » En línea

Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Sacar con scanf() todo el contenido del buffer del teclado.- « 1 2 »
Programación C/C++
DanielC 10 7,702 Último mensaje 9 Septiembre 2010, 01:33 am
por leogtz
Consultas SQL para saber key Buffer en MyISAM y Buffer Pol en InnoDB
Bases de Datos
el-brujo 0 3,665 Último mensaje 23 Mayo 2012, 16:34 pm
por el-brujo
Problemas con el teclado en portatil y teclado inalambrico
Hardware
any_t 2 4,572 Último mensaje 2 Septiembre 2012, 16:08 pm
por simorg
problema con el buffer del teclado no es fflush(stdin) tranquilos
Programación C/C++
gitii 3 2,191 Último mensaje 30 Abril 2018, 21:04 pm
por gitii
funcion limpiar buffer de teclado
Programación C/C++
Locura_23 8 10,370 Último mensaje 15 Octubre 2021, 23:57 pm
por RayR
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines