2017-10-10 25 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,你可以使用各种技巧来避免这种转换,但它们有点难看。

我有一些代码,我可以分享,但我不要求它是生产质量,甚至是可以理解的。这个看似简单的问题实际上比第一印象所提出的要复杂得多。做得不好很容易,但很难做好。