使用C,我想格式化我的输出,使终端中的输出在到达窗口边缘时停止



如果在终端中键入ps aux并使窗口非常小,则命令的输出不会换行,并且格式仍然非常清晰。

当我使用printf并输出我的5或6个字符串时,有时我的输出长度超过了终端窗口的长度,字符串会换行到下一行,这完全破坏了格式。如何编写程序,使输出继续到窗口边缘,但不再继续?

我试着搜索这个问题的答案,但我很难缩小范围,因此我的搜索结果似乎与它无关。

谢谢!

有一些函数可以让您了解有关终端窗口的信息,还有一些函数可以允许您操作它。请查找"ncurses"或"termcap"库。

解决问题的一个简单方法是获取终端窗口的大小(特别是宽度),然后相应地格式化输出。

有两种可能的答案可以解决您的问题。

  1. 关闭终端模拟器中的换行(如果它支持的话)。

  2. 看看诅咒图书馆。像top或vim这样的应用程序使用Curses库进行屏幕格式化。

您可以使用其他答案描述的方法来查找或至少猜测终端的宽度。然而,这只是问题的一部分——棘手的是格式化输出以适应控制台。我认为除了逐字逐句地阅读文本,并在单词溢出宽度时将输出移到下一行之外,别无选择。您需要实现一种方法来检测空白的位置,考虑到一行中可能有多个空白。你需要决定如何处理断线空白,比如CR/LF,如果你有。你需要决定是否可以在标点符号(例如连字符)上打断一个单词。我的方法是使用一个简单的有限状态机,其中的状态是"行首"、"单词中"、"空白中"等,遇到的字符(或者更确切地说是字符类)是改变状态的事件。

在C语言中工作时,一个特别复杂的问题是对多字节字符几乎没有内置支持。这对于你确信只会使用英语的文本来说很好,并且只使用ASCII标点符号,但对于任何形式的国际化,你都需要更加小心。我发现最简单的方法是将文本转换为某种宽格式,也许是UTF-32,然后使用32位整数数组来表示字符。如果你的文本是UTF-8,你可以使用各种技巧来避免这种转换,但它们有点难看。

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

最新更新