| |||
La funcion getchar() Hola, no entiendo como trabaja la funcion getchar() y putchar(), le doy valores a getchar() y luego uso putchar y me escribe un caracter, tengo q usarlo con el while, pero como funciona? :/ :/ |
| ||||
Respuesta: La funcion getchar() El teclado tiene un buffer. Si tienes un código igual a ese:
Código C:
Ver original Lo que ocurre es que getchar se detiene para pedir una letra pero realmente nada impide que metas ahí 100 letras, todas van a parar al bufer. Lo que pasa es que cuando pulsas enter, como bien sabes la variable char soloalmacena una variable a la vez, y getchar() no lee desde el teclado, sino desde el buffer del teclado, como le metimos 100 letras en el buffer, pues hasta que no lo vacíe sacando una a una no se queda contento el putchar(). XD O sea... si me pide en la primera linea del bufer: while ( ( variable = getchar() ) != '0'){ ...una letra y le meto 100, el bucle va funcionar 100+1 veces hasta sacar todas las 100 letras char a char del bufer, mas el enter que también se considera un char. un código para que lo entiendas puede ser este:
Código C:
Si pones abcdf te imprimirá eso:Ver original abcdef a -Bucle yupiiiii b -Bucle yupiiiii c -Bucle yupiiiii d -Bucle yupiiiii e -Bucle yupiiiii f -Bucle yupiiiii -Bucle yupiiiii El ultimo yupiiiii que no tiene letra es por que pulsaste enter y también se considera una letra pero no es imprimible sino que hace salto de linea y por eso el ultimo enter no va pegado a las demas lineas sino que tiene una linea en blanco entre los anteriores yupiiis XD. Entonces si entras a, b, c, d, e, f y pulsas enter harás 7 yupis tendras un espacio y luego un yupi ahi to misterioso jaja. Ese bucle te sirve para vaciar el bufer, y incluso es mejor que fflush si le das unos retoques. XD Espero que te sirva Última edición por vangodp; 19/10/2014 a las 14:24 |
| |||
Respuesta: La funcion getchar() Muchas gracias de verdad! muy buena tu explicación y tu ejemplo, me ayudó mucho. Tengo una dudilla q tal vez sea boba pero me la quiero sacar: Si este es el código con un while: while ( ( variable = getchar() ) != '0'){ putchar(variable); printf(" -Bucle yupiiiii\n"); } Y lo haces correr y te sale: (aparece el espacio para q escribas por variable=getchar entonces pongo abc y enter) a -Bucle yupiiiii b -Bucle yupiiiii c -Bucle yupiiiii -Bucle yupiiiii Por que si está con un while no queda así??: (aparece el espacio para q escribas por variable=getchar entonces pongo abc) a -Bucle yupiiiii (vuelve a pasar por el while y aparece el espacio para q escribas por variable=getchar de nuevo como al principio porque vuelve a pasar por el while( ( variable = getchar() ) != '0') de nuevo) b -Bucle yupiiiii (aparece el espacio para q escribas por variable=getchar de nuevo como al principio porque vuelve a pasar por el while etc.) c -Bucle yupiiiii O sea, me funciona tal cual me lo pasaste, todo ok. Pero me quiero sacar esa duda boba, por que si vuelve a pedir la condicion de ese while q al principio me pidió q ingrese algo, por que no lo vuelve a hacer cuando vuelve a pasar? es como q despues ignora el variable=getchar(). Espero hacerme entender :P |
| ||||
Respuesta: La funcion getchar() La verdad no he pillado lo que quieres decir. A ver si lo entiendo por que mi cerebro es medio loco y se va por las ramas XDD Dices que luego de introducir a, b y c te sale: a -Bucle yupiiiii b -Bucle yupiiiii c -Bucle yupiiiii -Bucle yupiiiii ... y no te vuelve a pedir mas? Pues si es eso no tengo ni idea. Pero mi teoría es que puede ser el compilador o la verdad no tengo ni idea. Pero te voy a decir que a mi si me funciona. a mi el bucle no se interrumpe hasta que pongo '0' (cero) O incluso el problema sea ese !='0' pero si no pones algo ahí se va a salir tras mostrar los primeros números Es que no se si te he entendido bien y por eso no se que decirte XD. prueba cambiar el cero por otro símbolo como *
Código C:
Ver original O si no tienes que trabajar exclusivamente con getchar el scanf te puede hacer el mismo trabajo pero con mas control. Prueba activar el estándar c99 con -std=c99. O a ver que venga un capo de la programación y nos explique que pasa XDD |
| |||
Respuesta: La funcion getchar() No no amigo, el codigo funciona perfecto por eso dije al final q funcionaba todo ok, es solo una duda mia de como funciona el codigo. A continuacion hago comentarios sobre lo q sería el recorrido del bucle, aqui voy a expresar lo q creo entender y mis dudas :P : while ( ( variable = getchar() ) != '0'){ //aqui agrego abc putchar(variable); //aqui muestra "a" de la variable "variable" y que todavia le quedan "bc" en el bufer printf(" -Bucle yupiiiii\n"); //aqui muestra -Bucle yupiiiii\n } Entonces continua el bucle: while ( ( variable = getchar() ) != '0'){ //quedaba "bc" en el bufer (mi pregunta: ¿ahi es como q le carga el valor "b" a la variable "variable" y de ahi compara si es 0?) putchar(variable); //aqui muestra "b" de variable y ahora le queda "c" en el bufer printf(" -Bucle yupiiiii\n"); //aqui muestra -Bucle yupiiiii\n } Continua el bucle: while ( ( variable = getchar() ) != '0'){ //quedaba "c" en el bufer (pregunta: ¿es como q le carga el valor "c" a la variable "variable" y de ahi compara si es 0?) putchar(variable); //aqui muestra "c" de la variable y no le quedaba nada en el bufer printf(" -Bucle yupiiiii\n"); //aqui muestra -Bucle yupiiiii\n } O sea, el getchar le va cargando un caracter a la variable "variable" para comparar si es distinto a 0? o como es q recorre solo el contenido del getchar()? desde ya muy agradecido por tus respuestas |
| |||
Respuesta: La funcion getchar() En lo q dije anteriormente creo que mi deducción estuvo mal :( , por ejemplo éste código q copio abajo, supuestamente cuenta las "y" despues del arroba: #include <stdio.h> int main(){ int cont=0; char var; printf("Ingrese su correo: "); var=getchar(); while(var!='*'){ if (var=='@') { var=getchar(); //como que este getchar hace correr un paso para q vea lo q hay despues del @ if (var=='y') { cont=cont+1; } } var=getchar(); //y este getchar() q hace? tambien lo hace correr un paso al siguiente caracter? y otra cosa a parte: el poder del enter q hace? :( } printf("%d \n",cont); return 0; } Última edición por emmx2012; 21/10/2014 a las 22:09 |
| ||||
Respuesta: La funcion getchar() a ver... como te dije getchar no le de la tecla que tu introduces sino del buffer. cuando en esa linea: while ( ( variable = getchar() ) != '0') ...le entras el abc intentare decirte lo que pasa en cada caso. 1º: while ( ( variable = getchar() ) != '0') // Esa linea se lee los datos enviándolos al buffer. El buffer es una memoria que va acumulando hasta que encuentra '\n' que es el enter. Si no pulsas enter sigue acumulando y acumulando. pulsas 'a', como a no es \n va al buffer. Pulsas 'b', como b no es \n va al buffer. Pulsas 'c', como c no es \n va al buffer. Entonces pulsas '\n'(ENTER), enter también es un caracter y va parar al buffer igual que las demas. Pero n\ es la señal que dice que ya no vas a entrar con mas datos y entonces es como decir: "Ya no voy entrar con mas datos vacíate". Pero entonces necesitas algo que te lo vacié, una función como bien puede ser getchar() que va obteniendo un char a la vez como su nombre indica get char. entonces digamos que has entrado "abc\n" asi quedaría el buffer tras entrar abc y pulsar enter. Entonces es la hora de actuar getchar()... va el y quita un char del bufer y lo mete en "variable" y luego se compara con '0', como 'a' no es '0' putchar imprime la variable. Luego se repite el proceso, getchar saca 'b' del bufer y lo mete en la variable, como 'b' != '0' putchar muestra la variable. Y luego el proceso se repite con c igualmente. También lo hace para el enter, pero la diferencia es que enter no es un carácter imprimible y no se le "ve". Pero si puedes notar que hay un salto de linea que no has pedido que haga y eso es el enter. Si entras con "abc0\n" ni te va mostrar el salto de linea por que cuando encuentre el 0 en el buffer el bucle while se va interrumpir inmediatamente por causa del !='0' dejando el enter en el buffer, incluso te puede provocar errores posteriores si intentas leer algún otro char o string posteriores al bucle. En fin mire este código: Entre con abc0 y pulse enter:
Código C:
te dejo una tabla asc2 muy util: http://www.elcodigoascii.com.ar/codi...digo-ascii.pngVer original La cosa es comprender que es el buffer y como trabaja ya que muchas funciones lo usan por no decir casi todas. Cuanto antes lo entiendas como trabaja antes puedes prevenir errores con el dichoso enter. XD |
Etiquetas: |