Limpieza de buffer de teclado en lenguaje C.

Iniciado por NOB2014, 11 Enero 2014, 18:16 PM

0 Miembros y 1 Visitante están viendo este tema.

NOB2014

Hola.
Cuando ingreso más de 3 cifras todo funciona a la perfección, pero si ingreso menos de 4 el programa se queda detenido en el bucle while de limpieza de buffer de teclado, es como cuando tiene algo para leer (más de 3 cifras) todo funciona Ok .-

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

int main(void){
unsigned int ok=0, ch=0, longitud=0;
char numeroChar[7] = "";

do{
system("cls");
printf("\n\n Ingrese un entero....:");
fgets(numeroChar, 5, stdin);
longitud = strlen(numeroChar);
while((ch = getchar()) != '\n');
numeroChar[longitud-1] = '\0';
printf("\n\n Ingresaste..: %s   -----> longitud = %d", numeroChar, longitud);
printf("\n\n 0 para continuar otro para salir....:");
scanf("%d" , &ok);
while((ch = getchar()) != '\n');
}while(ok==0);

return 0;
}
   

Bueno espero que me ayuden porque hace 2 días que estoy googleando y practicando y no logro la solución y por favor un poco de teoría del porqué.-       

Saludos.

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

vangodp

No se si es eso que lo quieres  :rolleyes:
Código (cpp) [Seleccionar]

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(void){
    unsigned int ok=0, ch=0, longitud=0;
    char numeroChar[7] = "";
     
    do{
    system("cls");
    printf("\n\n Ingrese un entero....:");
    scanf("%s",&numeroChar);
    longitud = strlen(numeroChar);
   
    while((ch = getchar()) != '\n')
    numeroChar[longitud-1] = '\0';
    printf("\n\n Ingresaste..: %s   -----> longitud = %d", numeroChar, longitud);
    printf("\n\n 0 para continuar otro para salir....:");
    scanf("%d" , &ok);
    while((ch = getchar()) != '\n');

   
    }while(ok==0);
     
    return 0;
    }

NOB2014

Hola vangodp.
Por el momento solo me limito a leer y no tengo argumentos para disentir en ciertas cosas por el poco tiempo que tengo estudiando C.-
Sólo voy a hacer unas pequeñas observaciones:
En primer lugar tengo leído que la única función que debo utilizar para leer cadenas es fgets y más en este caso que necesito un máximo restringido de caracteres ingresados.-
En segundo lugar si ingreso 12345678 el resultado es incorrecto.-



Luego de lo observado el programa funciona muy bien.-
De cualquier manera en este instante encontré la solución.-   

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

int main(void){
unsigned int ok=0, ch=0, c=0, longitud=0;
char numeroChar[7] = "";

do{
system("cls");
printf("\n\n Ingrese un entero....:");
fgets(numeroChar, 5, stdin);
longitud = strlen(numeroChar);

do{
if(ch == 0) break;
}while((ch = getchar()) != '\n');

numeroChar[longitud-1] = '\0';
printf("\n\n Ingresaste..: %s   -----> longitud = %d", numeroChar, longitud);
printf("\n\n 0 para continuar otro para salir....:");
scanf("%d" , &ok);
while((c = getchar()) != '\n');


}while(ok==0);

return 0;
}
        

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

vangodp


leosansan

#4
Cita de: vangodp en 12 Enero 2014, 03:53 AM
;) muy bien pues.
Suerte!

Pues no, no está solucionado.

En tu caso, amigo vangodp, si limitas el número de caracteres  con:


Código (cpp) [Seleccionar]

scanf ("%5s",numeroChar);


SI FUNCIONA.

Y en el caso de NOB2014 ni flores:


Citar

Ingrese un entero....:123


Ingresaste..: 123   -----> longitud = 4

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


Ingrese un entero....:12345


Ingresaste..: 123   -----> longitud = 4

0 para continuar otro para salir....:
Process returned 0 (0x0)   execution time : 5.255 s
Press any key to continue.


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



REEDITADO.

vangodp

La verdad no lo eh mirado jaja
Me lo creo en su palabra, pero no se por que la gente dice cosas que no son :/
1º a mi si me funciona mi código bien.
Y aquí esta la prueba.


2º los detractores de Dev c++ lo van a atacar creyendo que me importa si a ellos no les gusta por que les mola mas el codeblocks.

3º por si no lo han visto el código lo comparto como cpp "SIEMPRE".
No es que lo quiera es que asi me lo guarda y no pretendo cambiar por que no programo en c.
A lo mejor por eso lo del error aun que no lo se el porque.
Supongo que por que en c el caracter final de una cadena es '\0' o eso creo, desconozco si eso es igual en c++

Por lo que fgets se usa para leer de archivo.

La solución puede que poco ortodoxa XD si imprimes 1234 y te dice 5 imprime la cadena-1 XD

Mira que pena jaja

Saludos leo, como dije antes si me equivoco perdón pues ^^
Veo que todo lo que hago tengo que poner fotos sino la gente no me cre XD

vangodp

#6
Ahora aquí pensando conmigo el código de NOB2014 me tiraba error.
Lo solucione poniendo la librería string.h antes de venir a dar espadadas en el foro.
Lo digo por si no lo habían notado XD
Puede que sea por eso.
Pero os dire la verdad XD
No tengo ni p**a idea por lo que es, puse un cin y me funciono perfecto, lo cambie por un scanf y va que palante.
Si no le mola la solución no puedo hacer na por que no consigo hace de su manera.
Solo me queda decir suerteeeee y hasta prontoooo!  :rolleyes:

PD: NO PIENSO EN CAMBIAR A CODEBLOCKS, ya os dije antes jajaj
Lo tengo instalado, cada vez que compilo el código en codeblocks me dice lo mismo.
Me parece que la gente es como un lorito(repite to lo que ha leído por ahí sin ni saber lo que dice)
No lo niego que pueda tener problemas, ni que no sea un colisionador de partículas como lo es codeblocks ><
Pero en vez de criticar devc++ y decir oye bahhh hombre dev c++ es una caca...¡cambiate ya! XD
A ver que me deen una lista de defectos que me obligue a cambiar.
Para los que dicen que esta desactualizado les diré que esta al día la versión de orwell.
Entonces algunos loritos van a decir que aun así la versión de owell es mala, pero como siempre no aportan nada ni ningún motivo(eso se debe por que lo han leído por ahí no se donde....blablabla).
Y por eso continuare utilizando Dev c++, si queréis que cambie van a tener que currar mas  :silbar:
Para los que dicen "desactualizado" os diré que esta es la ultima fecha November 5, 2013. Como ves no es tan desactualizado así.
Repito 1000 pares de veces, no soy veterano pero a mi Dev aun no me dejo tirado, el codeblocks lo tengo para ver si el código compila en ambos y "siempre a sido correcto" lo mismo en uno que con otro.
Ahora seria injusto que no os dijera el por que uso dev en vez de code: El Dev es una bala, le hago doble click y se abre, no como codeblocks que le abro y voy a tomar un café de tan bueno que es XD
Como digo siempre siempre siempre, ya os eh expuesto mis motivos por que lo utiliso.
Ahora hacer un favor si alguien "sabe"(no loritos, ni colisionadores de partículas o navajas suizas aparte).
Me pone de los nervios mil iconos por todas las partes para funciones extras, y me gusta que el programa responda.
Si de verdad sabeis el por que NO debo utilisar dev os diré lo que digo siempre"Soy todo oídos".
Ignoro las diferencias que tenga entre uno y otro, y eso no me va hacer mejor persona.
Cuando abro un IDE quiero programar y no tirar media hora configurando cosas XD
;-)


leosansan



Pues si que funciona. Fue un error mío ya que al pedirme la opción de introducir el cero introduje el número directamente y, claro como no empezaba con cero se cerro el programa. la verdad es que me extrañaba que el scanf fallara seguido del while para limpiar el buffer, ya que lo he hecho multitud de veces.

Pero al César lo que es del César, ya reedité el post anterior.
¿por qué guardas como .cpp lo que son en realidad códigos .c?. No cuesta tanto cuando te pide guardar, que por defecto sale ,cpp, quitarle las dos p y tenerlo así en c como corresponde. Claro que si es por comodidad nada que objetar.

Y lo del Code::Blocks es para hablar más despacio y con tiempo. Sólo el mero hecho de usar múltiples ventanitas dentro de la ventana del propio Code::Blocks y con múltiples pestañitas a la vez en cada ventanita me vale. Para que te hagas una idea, yo suelo tener más de 30 códigos abiertos al mismo tiempo, con la comodidad de tenerlos repartidos en ventanitas y pestañitas diferentes, lo que me facilita el acceso a cada código. Por no hablar de las interioridades que ya sería un tema más prolijo y/o extenso.


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



vangodp

No eh probado lo de las divisiones.
¿Cuantas la puede abrir?
Suelo usar lo básico de un editor, de echo uso el notepad++ por que tiene buenas funciones de edición, creo que como editor supera a todos los demás pero a pesar de poder compilar deja mucho que desear as veces tengo el texto abierto en ambos y me paso de uno a otro según el problema.
Una de las cosas que me gusta es por ejemplo escribir varias lineas a la vez, las macros y otras cosillas mas, lo tiene muy a mano.
¿Como se utiliza lo de las ventanas múltiples?Digo la división de ventanas.
¿Cuantas divisiones puede hacer el codeblocks y como se hace?
Estoy probando el editor emacs, es muy potente pero no me muevo tan suelto como en notepad++, pero ya llego ahí también con tiempo. :D
Eh probado el vim y lo de los modos no me gusto mucho, y miles de comandos no se me entra en la cabeza jeje
Prefiero partir la muñeca con las combinaciones  :laugh:
Saludos ^^

vangodp

#9
Citar¿por qué guardas como .cpp lo que son en realidad códigos .c?
Por que le doy al iconito del disquete.
Se me olvida usar el "guardar como" y elegir .c
Pero mirar como comparto el código como c++, eso si lo tengo claro.
Supongo que causa algunos problemas de compatibilidad, por que el compilador usa el g++ envés de gcc creo.
Yo no suelo usar funciones de c aun que hay veces que no hay mas remedio. Pero si puedo evitar mejor, si lo guardo como cpp puedo usar c pero no al contrario.
Tengo que prestar mas atención en eso, por que cuando pongo aquí el código me suele pasar eso.
Me gusta el c bastante, es muy claro y potente pero estoy con el c++.
Pero vosotros tenéis que fiar que cuando se comparte el código lo hago como cpp y ahi nunca me equivoco.Sino cualquier día viene uno aquí con un código en java y iréis a compilar como C  :laugh: