Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] La funcion getchar()

Estas en el tema de La funcion getchar() en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 18/10/2014, 18:43
 
Fecha de Ingreso: agosto-2014
Mensajes: 35
Antigüedad: 9 años, 8 meses
Puntos: 0
Pregunta 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? :/ :/
  #2 (permalink)  
Antiguo 19/10/2014, 07:09
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: La funcion getchar()

Buenas,

getchar recupera un caracter de la entrada standard (stdin).
putchar(char c) envia un caracter a la salida standard (stdout)

Cuando llamas a getchar() normalmente se hace una llamada a getc(stdin) (fgetc(stdin) en realidad)
Cuando llamas a putchar(char c) normalmente se hace una llamada a fputc(c, stdout)


Un saludo
__________________
If to err is human, then programmers are the most human of us
  #3 (permalink)  
Antiguo 19/10/2014, 14:08
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: La funcion getchar()

El teclado tiene un buffer. Si tienes un código igual a ese:
Código C:
Ver original
  1. char variable;
  2.    
  3.     //hasta que la letra no sea un numero cero no se para
  4.     while ( ( variable = getchar() ) != '0'){
  5.         putchar(variable);
  6.     }

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:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main (){
  5.    
  6.     char variable;
  7.    
  8.     //hasta que la letra no sea un numero cero no se para
  9.     while ( ( variable = getchar() ) != '0'){
  10.         putchar(variable);
  11.         printf(" -Bucle yupiiiii\n");
  12.     }  
  13.    
  14.     getchar(); // no te líes que este getchar es solo para pausar y no tiene nada que ver con el bucle XDD
  15.     return 0;
  16. }
Si pones abcdf te imprimirá eso:
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
  #4 (permalink)  
Antiguo 21/10/2014, 09:41
 
Fecha de Ingreso: agosto-2014
Mensajes: 35
Antigüedad: 9 años, 8 meses
Puntos: 0
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
  #5 (permalink)  
Antiguo 21/10/2014, 11:02
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
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
  1. while ( ( variable = getchar() ) != '*' ) {
  2.         putchar ( variable );
  3.         printf ( " -Bucle yupiiiii\n" );
  4.     }

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
  #6 (permalink)  
Antiguo 21/10/2014, 17:08
 
Fecha de Ingreso: agosto-2014
Mensajes: 35
Antigüedad: 9 años, 8 meses
Puntos: 0
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
  #7 (permalink)  
Antiguo 21/10/2014, 21:50
 
Fecha de Ingreso: agosto-2014
Mensajes: 35
Antigüedad: 9 años, 8 meses
Puntos: 0
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
  #8 (permalink)  
Antiguo 22/10/2014, 08:46
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
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:
Ver original
  1. #include <stdio.h>
  2.  
  3. int main (){
  4.    
  5.     char variable;
  6.    
  7.     //Entre con la cadena "abc0" y pulse enter
  8.     while ( ( variable = getchar() ) != '0'){
  9.         putchar(variable);
  10.         printf(" -Bucle yupiiiii\n");
  11.     }  
  12.    
  13.    
  14.     //voy a demostrar que salto de linea sigue en el buffer y lo voy a extraer con este ultimo getchar    
  15.     variable = getchar();
  16.    
  17.     //segun la tabla asc2 un salto de linea(ENTER) es equivalente a 10 en decimal. Si for asi...
  18.     //...imprimira lo de abajo antes de terminar
  19.     if( variable == 10 ){
  20.         printf ("Enter estaba en el buffer tras el bucle, la tecla es: %d. Confiera en la tabla asc2 la tecla enter.", variable );
  21.     }
  22.    
  23.     //¿Aque no se imprimio el salto?Pero siguia en el buffer y lo extrajimos después del bucle
  24.    
  25.     getchar();
  26.     return 0;
  27. }
te dejo una tabla asc2 muy util: http://www.elcodigoascii.com.ar/codi...digo-ascii.png
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
  #9 (permalink)  
Antiguo 22/10/2014, 14:56
 
Fecha de Ingreso: agosto-2014
Mensajes: 35
Antigüedad: 9 años, 8 meses
Puntos: 0
Respuesta: La funcion getchar()

Aaaaaahhhhh, te agradezco mil veces amigo!! muy buenos tus ejemplos gracias por aclararme este tema!!
  #10 (permalink)  
Antiguo 22/10/2014, 16:41
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: La funcion getchar()

de nada ;).
Tu haz lo mismo por alguien cuando puedas ;)

Etiquetas: char, funcion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:05.