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");