El programa que intento hacer pretendo que sea portable entre plataformas, por lo que intento que no tenga más dependencias que la propia runtime de C. Lo que estoy intentando leer del teclado una cadena de (como mucho) 10 caracteres. Además, como no todos los caracteres son válidos, intento que el usuario solo pueda introducir letras, números y algún espacio.
Uno de los problemas es que Windows no envía los caracteres a C hasta que se pulse enter... no sé si Linux lo hará igual.
Soluciones que he intentado:
- Usando gets() -> El mayor problema es que cualquier algunos caracteres no alfanuméricos (como el espacio, tab) actuán como separador entre cadenas... y yo quiero capturar también el espacio.
- Un bucle usando getc() -> Como he dicho, Windows no enviará los caracteres hasta que se pulse enter, de manera que no puedo cogerlos de uno en uno.
- Usando scanf() -> He visto por ahí que podía usar scanf("%10[0-9a-zA-Z ]",cadena), pero el problema es que C trata como separador de cadenas cualquier carácter que no esté en el filtro (por ejemplo, un $) y yo trato de ignorarlos.
La solución más obvia sería hacer un bucle que leyera una pulsación cada vez. Si está en los caracteres admitidos, lo muestro en pantalla y lo añado a mi cadena. Así hasta que se pulse enter.
El problema de esta solución es que no encuentro la función que me lea pulsación a pulsación. Bueno, sí, están por ahí flotando getch() y getche(), pero pertenecen a conio.h (biblioteca de Borland, solo presente en Windows) o curses.h (portable) pero yo quería que mi programa no tuviera dependencias. Una opción sería compilar estáticamente curses.h (porque no suele estar instalada en Windows), pero no sé bien cómo hacerlo ni el impacto que tendría en el tamaño de mi ejecutable.
Otra opción sería hacer un bucle que lea cadenas y las concatene hasta que no haya nada pendiente de leer en el teclado, pero no sé cómo hacerlo.
¿Alguna idea más?