gotoxy(x,y) y clrscr() de C sobre Linux

Se me había ocurrido compilar algunos de los programitas que hice hace dos o tres años en C en Windows y claro, ahora en Linux daban algunos fallos por librerías y funciones utilizadas. Lo normal.

Sin embargo, me ha llamado la atención de que no funcionaran ni gotoxy(x,y), ni clrscr(). La primera para ir a unas coordenadas de la pantalla para poder escribir a continuación allí, en lugar de línea a línea, y la segunda para limpiar toda la pantalla. Y da la casualidad de que ayer me aburría y me apeteció programarme un Juego de la Vida de Conway, de modo que necesitaba una función que sustituyese al gotoxy(x,y).

Así pues he intentado mirar en algún manual y luego he googleado un poco. Parece ser que estas dos funciones sólo están en librerías del DOS, y que no hay equivalente en librerías existentes en Linux. Hay bastantes hilos en foros de gente preguntando por eso mismo, y en algunos la solución que dan es definir esas funciones en tu propio código. Por supuesto, acompañan el código.

El clrscr() no puede ser más simple: un bucle con tantos intros como desees, unos 50 serán más que suficientes, aunque todo depende del tamaño de la ventana. ¿Para qué complicarse más la vida?

Para el gotoxy(x,y) ya es necesaria una secuencia de escape, la \033:

Escape sequences allow you to send nongraphic control characters to a display device. For example, the ESC character (\033) is often used as the first character of a control command for a terminal or printer. Some escape sequences are device-specific. For instance, the vertical-tab and formfeed escape sequences (\v and \f) do not affect screen output, but they do perform appropriate printer operations.

He encontrado el código para la función gotoxy(x,y) en dos sitios, uno más largo y otro más reducido. He comprobado que funcionan ambas. Copio aquí el reducido:

#define MAX_SCREEN_AREA 100
int gotoxy(int x, int y){
char essq[MAX_SCREEN_AREA]={0}; // String variable to hold the escape sequence
sprintf(essq, "\033[%d;%df", y,x);
printf("%s", essq);
return 0;
}

De todas formas, he descubierto que no es necesaria tanta línea. Analizando el código que visto cómo funcionaba y he probado a incluir la secuencia de escape directamente en un printf() y, voilá, funciona. Supongo queirá también con scanf() y otros.

printf("\033[9;9f asdf\n");

Únete a la conversación

3 comentarios

  1. interesante MON, el tema del scanf lo usare en algun momento pero en principio no deberia reportar nigun problema a la hora de usarlo incluso creo que si le metieses encima del gotoxy un printf y luego un scanf conseguirias que introduciese el dato arriba y lo asignase abajo y con una funcion for podrias hacer que te recogiese lo que quieres introducir en ese espacio para luego implantarlo todo de golpe ^_^, con un if final para confirmar si estas conforme con el resultado mostrado por pantalla ^_^. le hare un tiento si me motivo

  2. fran, sí, gotoxy(x,y) sirve para desplazar el cursor a esas coordenadas, de modo que se utiliza mucho con printf.

    fernand0, muchas gracias por el vínculo. El sistema es similar, pero explica otras funciones muy útiles.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *