[C con Clase] guardar string o caracter sin presionar enter en ANSI C

D1e6o! diegogeid en gmail.com
Mar Jul 7 07:07:56 CEST 2009


El 7 de julio de 2009 01:13, D1e6o!<diegogeid en gmail.com> escribió:
> El 30 de junio de 2009 22:26, Diego<bruceleechile en gmail.com> escribió:
>> Hola a todos
>>
>>  Mi consulta es la siguiente, quiero saber si existe alguna forma de guardar un string o caracter ingresado por el usuario sin presionar la tecla enter, por ejemplo:
>>
>>  temp[15] = "";
>>  printf("Ingrese frase: ");
>>
>>
>> si el usuario escribe:   a
>> eso se guardara automaticamente en el string temp, para trabajar luego con él, una vez lo utilizamos (se supone esto pasa de forma invisible al usuario y de forma instantanea xD!), el usuario a esa a escrita anteriormente le añade otra letra por ejemplo:    m   quedando asi   am
>> se guarde am en el string temp que se supone ya estara limpio nuevamente para trabajar nuevamente con éste string.
>>
>> La idea es que se guarde en el string sin presionar la tecla ENTER, queria sacar una idea del getchar q es ANSI C, pero no se como trabaja internamente, ni he podido encontrar su codigo.
>>
>> Espero me puedan ayudar :)
>>
>> Saludos a todos y gracias de antemano ;)
>>
>>
>> _______________________________________________
>> Lista de correo Cconclase Cconclase en listas.conclase.net
>> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
>> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>>
>
> El problema es que no es una función de c, sino que eso depende del
> hardware y sistema operativo.
> La lectura de caracteres no es una librería de c, aunque parezca, sino
> que son funciones del sistema operativo, es por eso que no existe.
> Supongo que tratando a stdin como un archivo (en definitiva, es del
> tipo FILE *) se debe poder crear esa función, pero no encuentro algo
> así, debería poder utilizarse con funciones de lectura de archivo,
> como fseek, etc. No me imagino como saber cuando se presiona una nueva
> tecla en c, debería ser cuando se actualize stdin
>

El buffer se actualiza solo cuando se presiona enter, al menos eso
sucede en linux, por lo tanto es necesario utilizar la función de cada
sistema operativo para la lectura de teclado (en windows la api
correspondiente)
Probé con algunos programas y no me funcionan ya que se bloquean al
esperar a stdin hasta que se presione la tecla
por ejemplo:

#include <stdio.h>

int main(int argc, char *argv[]) {
    char i;
    while(i!=27){
    i=fgetc(stdin);
    printf("%c\n",i);
    }
    return 0;
}

Espera a que se presione enter para comenzar a procesar los ingresos
de teclado, procesandolos todos juntos al final.
Por lo tanto, el buffer stdin bloquea las instrucciones
Lo msimo sucede con fread, etc.

Además teóricamente podría ser una solución simular la pulsación de
'\n' , por lo tanto, al ejecutar esto antes de una lectura siempre
debería haber un '\n', o sea, finalización de cadena, pero en la
práctica dió error.

#include <stdio.h>

int main(int argc, char *argv[]) {
    char i;
    while(i!=27){
    if(fputc('\n',stdin)==EOF)printf("error!");//mete '\n' al buffer,
si da EOF => no es posible
    i=fgetc(stdin);
    if(i!='\n')printf("%c\n",i);
    }
    return 0;
}

Como puedo simular presionar una tecla? Es posible a través de algún
estandar de ansi c? Yo lo estoy metiendo en el buffer, el cual no
varía hasta que no se presione enter, por lo tanto no tendría sentido
hacerlo de esta forma aunque fputc me lo permitiera.




Más información sobre la lista de distribución Cconclase