GNU/Linux >> Linux の 問題 >  >> Linux

Cで端末の幅を取得しますか?

この例は少し長いですが、端末の寸法を検出する最も移植性の高い方法だと思います。これはサイズ変更イベントも処理します。

tim と rlbond が示唆するように、私は ncurses を使用しています。環境変数を直接読み取る場合と比較して、端末の互換性が大幅に向上することが保証されます。

#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);
}

getenv() の使用を検討しましたか?端末の列と行を含むシステムの環境変数を取得できます。

別の方法を使用して、カーネルが端末のサイズとして認識しているものを確認したい場合 (端末のサイズが変更された場合に適しています)、TIOCGSIZE ではなく、TIOCGWINSZ を使用する必要があります。

struct winsize w;
ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);

および完全なコード:

#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
}

Linux
  1. Cowsay:Linux ターミナルで楽しむ

  2. 端末に出力する場合は C で検出します

  3. ターミナルでのパスワード入力を隠す

  1. Zshの使用を開始する

  2. Linuxターミナルで冒険に出かけましょう

  3. |ターミナルコマンドで?

  1. Linuxターミナルでのmvコマンドの5つの使用

  2. Ubuntu ターミナル

  3. 実行中のプロセスを一覧表示する Linux API?