【问题标题】:how print in c without jumping to end of text?如何在c中打印而不跳转到文本末尾?
【发布时间】:2019-01-31 12:10:34
【问题描述】:

我对编码很陌生,所以请原谅我说的任何愚蠢的话。

我正在尝试使用 printf() 打印(在 c 中)相当长的文本,但由于它不能全部显示在屏幕上,它会跳转到文本的末尾,除非您向上滚动,否则开头是不可见的。有没有一种简单的方法可以让它打印长文本但留在开头并允许用户在阅读时向下滚动,然后再输入下一个命令?

【问题讨论】:

    标签: c less-unix


    【解决方案1】:

    在 Unix(包括 Linux 和 Mac)上,内置了名为 moreless 的命令行程序,它们完全符合您的描述。 more 是一个程序,它只是等待用户在显示下一页输出之前按回车键或空格键。 less 略有改进,它允许 vi 编辑器击键(如 j 和 k)在输出中上下滚动。

    more 也可以在 Windows 命令行中使用。您甚至可以找到less for Windows as well 的版本。

    c:\users\selbie> your_program.exe | more
    
    $> ./your_program | less
    

    至于如何以编程方式执行此操作,这有点困难,因为它涉及测量控制台宽度和实现您自己的滚动缓冲区。可能有提供此功能的开源库,但控制台环境已经为产生长输出的应用提供了解决方案。

    【讨论】:

    • 这听起来像我需要的。非常感谢朋友。
    • 请注意,OP 表示用户需要“输入下一个命令”,因此我不确定此解决方案是否有效,因为它有效地使程序仅输出。
    • 哦哦。我认为您可能是对的@JohnZwinck。我想我找到了一种获取终端窗口当前高度的方法,所以我会提示用户在这么多行之后按 Enter。
    • 我有一些示例代码,用于在 Unix here 和 Windows 上获取示例代码,您可以找到示例 here
    【解决方案2】:

    并非如此,尽管您可能会发现一个合理且简单的解决方案是只打印一定数量的行(例如 30 行),然后提示用户在显示更多行之前按 Enter。

    您甚至可以找出终端的当前大小。那是特定于平台的;对于 Linux,这里有解释:How to get terminal window width?

    【讨论】:

    • 是的,这是我的另一个解决方案,但我只是想确保没有简单的方法允许滚动。
    【解决方案3】:

    不是以标准方式,不。

    您在 C 中的输出流只是一个字符流——滚动由您的终端处理。

    根据您的终端,可能可以通过输出特殊字符来控制滚动,例如ANSI escape codesncurses library 提供了一种操作终端的便携方式。

    但是,如果您只是想要一种更方便的方式来查看您的输出(或实际上是任何命令输出),@selbie 的答案是最好的:使用moreless。这将避免您的程序产生任何额外的复杂性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-24
      • 1970-01-01
      • 2020-02-21
      相关资源
      最近更新 更多