Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Bb-7 en 15 Febrero 2008, 18:59 pm



Título: ¿Para qué sirve la función getchar?
Publicado por: Bb-7 en 15 Febrero 2008, 18:59 pm
Pos justamente éso.
He visto un ejemplo que había en un curso de C, pero no especificaba para qué servía el 'getchar();'. Éste es el ejemplo:

#include <stdio.h>

int main()
     {
     char ch;
     char nombre[20], apellido[20], telefono[10];
     printf( "Escribe tu nombre: " );
     scanf( "%[A-Z]s", nombre );
     printf( "Lo que recogemos del scanf es: %s\n", nombre );
     printf( "Lo que había quedado en el buffer: " );
     while( (ch=getchar())!='\n' )
            printf( "%c", ch );
     }


Y lo que daba el programa era ésto:

Escribe tu nombre: GORka
Lo que recogemos del scanf es: GOR
Lo que había quedado en el buffer: ka

Ya sé para qué sirven las demás funciones (scanf, printf, etc.). Sólo quiero saber para qué sirve getchar();.

Saludos y gracias.


Título: Re: ¿Para qué sirve la función getchar?
Publicado por: Lambda en 15 Febrero 2008, 19:10 pm
http://www.conclase.net/c/librerias/funcion.php?fun=getchar


Título: Re: ¿Para qué sirve la función getchar?
Publicado por: AxXioma en 17 Febrero 2008, 00:29 am
Sirve para almacenar en una variable un caracter escrito mediante el teclado, un ejemplo:

Código:
#include <stdio.h>
{
char letra;

letra = getchar();
putchar(letra);
}

putchar imprime en pantalla lo que has introducido.

Saludos


Título: Re: ¿Para qué sirve la función getchar?
Publicado por: zonahurbana en 17 Octubre 2012, 06:29 am
Iba a crear un tema nuevo. Pero la duda es exactamente la misma.

Tengo entendido que al ingresar datos y presionar Enter, éste último es tomado como entrada (también). Y por ello es necesario limpiar el buffer.

Sin embargo, no comprendo muy bien cómo es que funciona getchar();
Es decir, no sólo quisiera saber la finalidad por la que se usado getchar, sino más bien, qué es lo que hace exactamente. Es decir, toma un caracter del buffer, pero si éste está vacío, le solicita al usuario que ingrese uno, ¿es más o menos así?

Dispongo de dos códigos para limpiar el buffer.

Código:
char ch;
while (cin.get(ch) && ch != '\n')
 ;

Código:
while (getchar() != '\n');

Duda #1. Quisiera saber cómo es el mecanismo interno (minucioso) de todo el proceso que ejecutan cada una de esas instrucciones (aunque no las hay, porque yo sólo veo un while, ¿será que getchar() y cin.get tienen la capacidad de suprimir caracteres?).

Duda #2. ¿En qué casos es necesario limpiar el buffer? ¿Por qué?

Duda #3. ¿Es lo mismo buffer que stream? ¿Y qué es un flujo?

Una duda un poco más alejada del tema:
Duda #4. Cuando declaro variables de un tipo y el usuario ingresa datos de otro tipo, en muchas ocasiones se entra en un bucle infinito, lo que normalmente no ocurriría si el usuario ingresara lo que se le solicita. O también ocurre esto cuando el usuario ingresa más contenido del permitido. ¿Cómo podría yo asegurar la entrada correcta de datos? Por ejemplo, usar isalpha o isdigit no tiene sentido en este caso, ya que esa comprobación sólo la podría hacer yo luego de que ya se ha ejecutado el cin>> (¿O sí es posible usarlos sobre el valor que se está tratando de ingresar justamente antes de almacenarlo?).

PD: Siempre veo que recomiendan enlaces de conclase, y yo nunca he podido ingresar (de ninguno de mis navegadores). ¿Sólo yo no lo puedo ver?

Muchas gracias de antemano. Espero puedan responderme!


Título: Re: ¿Para qué sirve la función getchar?
Publicado por: do-while en 17 Octubre 2012, 08:45 am
Duda #4. Cuando declaro variables de un tipo y el usuario ingresa datos de otro tipo, en muchas ocasiones se entra en un bucle infinito, lo que normalmente no ocurriría si el usuario ingresara lo que se le solicita. O también ocurre esto cuando el usuario ingresa más contenido del permitido. ¿Cómo podría yo asegurar la entrada correcta de datos? Por ejemplo, usar isalpha o isdigit no tiene sentido en este caso, ya que esa comprobación sólo la podría hacer yo luego de que ya se ha ejecutado el cin>> (¿O sí es posible usarlos sobre el valor que se está tratando de ingresar justamente antes de almacenarlo?).

Tendras distintas opciones dependiendo del lenguaje:

C: scanf devuelve un valor indicando cuantos de los datos especificados se han leido. Devolvera un valor menor al numero de elementos de la lista de parametros que debe leer si: hay un error de lectura, el parametro no corresponde con el especificador de tipo o se encuentra EOF.

Por lo tanto, si quieres asegurarte de que los datos que lees son correctos, te recomiendo leer los datos de uno en uno y comprobar si se han leido de forma correcta comprobando el valor devuelto por scanf. Por ejemplo:
Código
  1. int entero,lector;
  2.  
  3. while(!scanf("%d",&entero))
  4. {
  5.    //se ha producido un error en la lectura por alguna de las razones anteriores
  6.    //terminamos de leer los datos que queden en la entrada para la siguiente lectura
  7.    while((lector = getchar()) != '\n' && lector != EOF);
  8. }
  9. //terminamos de leer los datos que queden en la entrada para la siguiente lectura
  10. while((lector = getchar()) != '\n' && lector != EOF);
  11.  

C++: El operador >> activara el failbit, si el tipo leido no coincide con el tipo del parametro o si hay algun tipo de error de lectura:
Código
  1.    int numero;
  2.  
  3.    while((cin >> numero).fail()) //si el leido no coincide con el del parametro o hay algun error
  4.    {
  5.        //resetamos los bits de error
  6.        cin.clear();
  7.  
  8.        //terminamos de leer los datos que quedan en la entrada para poder realizar la siguiente lectura
  9.        while(cin.get() != '\n' && !cin.eof());
  10.    }
  11.    //terminamos de leer los datos que quedan en la entrada para poder realizar la siguiente lectura
  12.    while(cin.get() != '\n' && !cin.eof());
  13.  

¡Saludos!