2017-10-10 6 views
0

端末にps auxと入力してウィンドウを小さくすると、コマンドの出力は折り返されず、フォーマットはまだ非常に明確です。CIを使用すると、端末の出力がウィンドウの端に達すると停止します。

私がprintfを使用して5桁または6桁の文字列を出力すると、出力の長さが端末ウィンドウの長さを超えることがあり、文字列が次の行に折り返されてしまいます。アウトプットがウィンドウの端まで続くように私のプログラムを書くことはできますか?

私はこの質問に対する回答を検索しようとしましたが、それを絞り込むのに問題があります。そのため、検索結果には何も関係がないようです。

ありがとうございます!

+0

端末のサイズを調べる必要があり、出力をそのサイズに合わせる必要があります。 TIOCGWINSZを検索してください。それは特徴的です。 –

答えて

0

問題を解決するための2つの可能な回答があります。

  1. (サポートしている場合)端末エミュレータで行折り返しをオフにします。

  2. Cursesライブラリを調べます。トップやvimのようなアプリケーションは、スクリーンフォーマットのためにCursesライブラリを使用します。

2

ターミナルウィンドウに関する情報や、それを操作できる機能があります。 "ncurses"または "termcap"ライブラリを探します。

問題を解決するための簡単な方法は、端末ウィンドウのサイズ(特に幅)を取得し、それに応じて出力をフォーマットすることです。

0

ターミナルの幅は、他の答えが示す方法を使って見つけることができます。しかしそれは問題の一部にすぎません。トリッキーなビットはコンソールに合わせて出力をフォーマットしています。私はテキスト単語を単語で読み、単語がその幅を越えたときに出力を次の行に移動するという選択肢はないと思います。空白の場所を検出するメソッドを実装する必要があります。これは、行内に複数の空白がある可能性があるという事実を考慮しています。 CR/LFのような改行の空白を処理する方法を決める必要があります。句読点で単語を区切ることができるかどうかを判断する必要があります(ハイフンなど)。私のアプローチは、状態が「行頭にある」、「単語で」、「空白で」などの単純な有限状態マシンを使用することです。文字(または文字クラス)は、状態を変えるイベント。

Cで作業するときに特に問題となるのは、マルチバイト文字の組み込みサポートがほとんどないことです。それはあなたが英語でしかないと確信しているテキストで、ASCII句読記号だけを使用しても問題ありませんが、どんな種類の国際化であれ、より注意する必要があります。私は、テキストをある種のワイドフォーマット、おそらくUTF-32に変換してから、文字を表現するために32ビット整数の配列を扱うのが最も簡単だと分かっています。あなたのテキストがUTF-8の場合、この変換をしなくても済むようにするための様々なトリックがありますが、少し醜いです。

私は共有することができるコードをいくつか持っていますが、私はそれが生産品質であると主張していないし、理解しやすいものでもありません。このシンプルに見える問題は、実際には第一印象よりもはるかに複雑です。ひどくやりにくいですが、うまくやるのは難しいです。

関連する問題