我正在努力了解K&R的练习1-21

这是我想要了解的问题:

编写一个程序’entab’,用最少数量的制表符和空格替换空白字符串,以达到相同的间距。 如果一个标签或一个空白就足以达到一个制表位,应该优先考虑?

解码问题:

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

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

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

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

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

标签为’#’,空格为’*’,TABSTOP = 8。

该陈述的含义是什么:“当标签或单个空白足以达到制表位时。”

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

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

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

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

 Character ASCII Tab 9 Linefeed 10 Carriage Return 13 Space 32 

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

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

现代文本编辑器和终端模拟器通常每8个字符设置制表位。 这就是“tabstop = 8”的含义。 止点位于第8,16,24,32列……,或者如果您认为最左边的列是1而不是0,则列9,17,25,33,… Tab停止实际上可在vt100-上编程ish终端,但这是一个很少使用的function。

返回文本编辑器,新行的开头,键入1 2 Tab 3 4 。 你会得到一个由制表符组成的空格分隔的1234 。 然后开始另一个新行并在标签前用空格键入相同的内容: 1 2 空格 Tab 3 4 。 第二行看起来与第一行完全相同,但这次1234之间的空格由空格和制表符组成。 通过键入空格直到它排成一行,使第三行看起来相同而不使用任何选项卡。

这3行是练习1-21计划可能输入的例子。 第一个使用单个选项卡而没有空格,使用最少的字符数,这样就是您要为所有3个输入输出的内容。

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