【问题标题】:I'm trying to understand the K&R's exercise 1-21 [duplicate]我试图理解 K&R 的练习 1-21 [重复]
【发布时间】:2018-09-01 21:33:06
【问题描述】:

这是我想要理解的问题:

编写一个程序“entab”,用最小值替换空白字符串 制表符和空白的数量,以实现相同的间距。当任一 制表符或单个空白就足以到达制表位,这应该 优先考虑?

解码问题:

一个。这是一个在输入中注入“标签”的程序。

b。如果一个字符串由连续的空格组成,那么这些空格 必须用最少数量的制表符和空格替换空格。

程序在以下输入中应该如何表现:

  1. 嘿*****
  2. ******你好
  3. 嘿**************你好!
  4. 嗨####嘿!
  5. 嗨***你好吗?
  6. 嗨#**嘿!

决定制表符的最小数量以及制表符和空格的组合的标准应该是什么?

'#' 表示制表符,'*' 表示空格,TABSTOP = 8。

这句话的意思是什么:“当一个制表符或一个空白足以到达制表位时。”

注意:我已经完成了这个重复问题的答案,但我 觉得它们没有帮助。

【问题讨论】:

  • @Broman:你确定吗? are 后面的 5 个空格可以用制表符代替。 you 后面的空格也不需要;之后的标签将到达相同的位置。
  • @JonathanLeffler 你是对的。我错了。
  • 在此处引用时请多加注意。我已编辑此问题以从非引号的内容中删除引号格式,并将引号格式添加到引号的内容中。弄错这个问题可能会使问题变得混乱,并可能会引起反对票。
  • 请注意,“没有帮助”的解释不足以解释为什么建议的重复项不是重复项。在我看来,它仍然是重复的。

标签: c kernighan-and-ritchie


【解决方案1】:

链接的可能重复问题侧重于正确地进行算术运算。我猜你的问题比这更原始:你真的不知道制表位是什么。

当 K&R 编写他们的练习时,他们可以期望读者有使用打字机的经验,这就是制表位的来源。 Tab 键使马车滑到下一个停靠点的位置,这是一个真实的物理事物,它实际上阻止了马车进一步移动,直到按下另一个键。 (后来的打字机变得更像计算机,编程停止位置而不是物理停止。)

制表符的目的是制表(制作表格)。制表位设置在分隔表格列的水平位置,然后在每个值后按制表键进入表格。例如,如果我想输入这个表格:

Character         ASCII
Tab               9
Linefeed          10
Carriage Return   13
Space             32

在不使用制表符的情况下,我必须在“制表符”一词之后多次输入空格,在“换行”之后输入空格的次数不多,而在“回车”之后只输入几次。但是,如果我在第二列开始的位置设置一个制表位,它会变得更容易。我在“Tab”这个词之后按一次Tab键,然后马车前进到9的正确位置,在“换行”这个词之后按一次Tab键,它前进到10的正确位置,等等。如果我需要第三列,我会在第二列的右侧稍微设置另一个制表位。

您可以在文本编辑器中体验这一点——不是一个花哨的 IDE,它将各种不相关的功能分配给 tab 键,而是像 vi 这样的普通 IDE。甚至是终端模拟器,运行一个什么都不做的程序 (cat > /dev/null)。键入几行不同长度的单词,每行后面都有一个制表符,观察它们是如何排列的,当你的一个单词长到足以占据 2 个表格列时会发生什么。继续使用它,直到您对制表符的作用有了直观的了解。

现代文本编辑器和终端仿真器通常每 8 个字符设置一次制表位。这就是“tabstop = 8”的意思。停靠点位于第 8、16、24、32 列...,或者如果您认为最左边的列是 1 而不是 0,则第 9、17、25、33 列...制表位实际上可以在 vt100- 上编程ish 终端,但这是一个很少使用的功能。

回到你的文本编辑器,在新行的开头,输入 1 2 Tab 3 4。你得到1234 由一些由制表符组成的空格分隔。然后开始另一个新行并在制表符前输入相同的内容: 1 2 space Tab 3 4。第二行看起来和第一行一模一样,但这次1234 之间的空格由空格和制表符组成。通过键入 space 直到它排成一行,在不使用任何制表符的情况下创建看起来相同的第三行。

这 3 行是练习 1-21 程序可能输入的示例。第一个,只有一个制表符,没有空格,使用最少的字符数,所以这就是您想要为所有 3 个输入输出的内容。

如果您需要帮助确定输出多少制表符和空格的通用公式,请参阅另一个问题。这是一个粗略的描述,留给你一些细节供你思考:当你阅读输入时,跟踪你所在的列。当你到达一个空格或制表符时,阅读到空格和制表符序列的末尾,记住序列开始时您所在的列。在序列结束时,您知道光标在哪一列,以及要将其移动到哪一列,并且您必须计算最佳的空格和制表符序列才能进行移动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 2020-06-25
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多