2017-10-10 51 views
0

如果鍵入ps aux到你的終端,使窗口非常小,該命令的輸出不會迴繞。格式還是很清晰的。使用CI想格式化我的輸出,使得在終端的輸出停止,一旦它擊中窗口的邊緣

當我使用printf和輸出我的5個或6串,有時我的輸出的長度超過該終端的窗口和琴絃換到下一行,其完全螺絲了的格式。我怎樣才能編寫我的程序,使輸出繼續到窗口的邊緣,但沒有進一步的?

我試圖尋找一個答案,這個問題,但我無法縮小下來,因此我的搜索結果不會有任何與它看起來是這樣的。

謝謝!

+0

你需要找到你的終端的大小,你需要調整你的輸出到這個大小。搜索TIOCGWINSZ。它是獨特的。 –

回答

0

有兩個可能的解決方案來解決您的問題。

  1. 關閉終端仿真器中的換行(如果支持的話)。

  2. 調查Curses庫。像top或vim這樣的應用程序使用Curses庫進行屏幕格式化。

2

有些功能可以讓你知道關於終端窗口的信息,還有一些功能可以讓你操作它。查找「ncurses」或「termcap」庫。

用於解決您的問題,簡單的方法將是獲得終端窗口大小(特別是寬度),然後相應地格式化輸出。

0

您可以使用其他答案描述的方法找到或至少猜測終端的寬度。這只是問題的一部分 - 棘手的一點是格式化輸出以適合控制檯。我不相信有一種方法可以逐字閱讀文本,並且當一個單詞溢出寬度時將輸出移動到下一行。您需要實現一種方法來檢測白色空間的位置,從而允許連續出現多個空白的事實。如果您有任何問題,您需要決定如何處理破折號的空格,如CR/LF。您需要決定是否可以打破標點符號(例如,連字符)。我的方法是使用一個簡單的有限狀態機,其中狀態是「在行首」,「在一個單詞中」,「在空白中」等,並且遇到的字符(或者相當於字符類)是改變狀態的事件。

在C工作當一個特定的複雜性在於,很少有到無的內置的多字節字符的支持。對於您肯定只會使用英文的文本而言,這很好,並且只使用ASCII標點符號,但對於任何形式的國際化您都需要更加小心。我發現將文本轉換爲寬格式(可能是UTF-32)最簡單,然後使用32位整數數組來表示字符。如果你的文本是UTF-8,你可以使用各種技巧來避免這種轉換,但它們有點難看。

我有一些代碼,我可以分享,但我不要求它是生產質量,甚至是可以理解的。這個看似簡單的問題實際上比第一印象所提出的要複雜得多。做得不好很容易,但很難做好。