Contoh ini agak panjang, tapi saya percaya ini adalah cara paling portabel untuk mendeteksi dimensi terminal. Ini juga menangani peristiwa pengubahan ukuran.
Seperti yang disarankan oleh tim dan rlbond, saya menggunakan ncurses. Ini menjamin peningkatan besar dalam kompatibilitas terminal dibandingkan dengan membaca variabel lingkungan secara langsung.
#include <ncurses.h>
#include <string.h>
#include <signal.h>
// SIGWINCH is called when the window is resized.
void handle_winch(int sig){
signal(SIGWINCH, SIG_IGN);
// Reinitialize the window to update data structures.
endwin();
initscr();
refresh();
clear();
char tmp[128];
sprintf(tmp, "%dx%d", COLS, LINES);
// Approximate the center
int x = COLS / 2 - strlen(tmp) / 2;
int y = LINES / 2 - 1;
mvaddstr(y, x, tmp);
refresh();
signal(SIGWINCH, handle_winch);
}
int main(int argc, char *argv[]){
initscr();
// COLS/LINES are now set
signal(SIGWINCH, handle_winch);
while(getch() != 27){
/* Nada */
}
endwin();
return(0);
}
Sudahkah Anda mempertimbangkan untuk menggunakan getenv() ? Ini memungkinkan Anda untuk mendapatkan variabel lingkungan sistem yang berisi kolom dan baris terminal.
Atau menggunakan metode Anda, jika Anda ingin melihat apa yang dilihat kernel sebagai ukuran terminal (lebih baik jika terminal diubah ukurannya), Anda perlu menggunakan TIOCGWINSZ, bukan TIOCGSIZE Anda, seperti:
struct winsize w;
ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
dan kode lengkapnya:
#include <sys/ioctl.h>
#include <stdio.h>
#include <unistd.h>
int main (int argc, char **argv)
{
struct winsize w;
ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
printf ("lines %d\n", w.ws_row);
printf ("columns %d\n", w.ws_col);
return 0; // make sure your main returns int
}