我想了解K&R的练习1-21

时间:2018-09-01 21:33:07

标签: c kernighan-and-ritchie

这是我要理解的问题:

  

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

解码问题:

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

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

  

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

     
      
  1. 嘿*****
  2.   
  3. ******嗨
  4.   
  5. 嘿**************嗨!
  6.   
  7. 嗨####嘿!
  8.   
  9. 嗨***你好吗?
  10.   
  11. 嗨#**嘿!
  12.   
     

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

     

“#”代表制表符,“ *”代表空格,TABSTOP = 8。

该语句是什么意思:“当一个制表符或单个空格足以达到制表位时。”

注意:我已经回答了这个重复的问题,但是我 对他们没有帮助。

1 个答案:

答案 0 :(得分:2)

链接的可能重复的问题集中在正确进行算术上。我猜您的问题比这更原始:您真的不知道制表位是什么。

当K&R编写练习时,他们可以期望读者具有打字机的经验,这是制表符停止的地方。 Tab键使滑架滑到下一个止动位置,这是一种真实的物理现象,实际上阻止了滑架继续移动,直到按下另一个键。 (后来的打字机变得越来越像计算机,已经对停止位置进行了编程,而不是物理停止。)

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

Character         ASCII
Tab               9
Linefeed          10
Carriage Return   13
Space             32

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

您可以在文本编辑器中体验到这一点-不是将所有不相关的功能分配给Tab键的高级IDE,而是像vi这样的普通功能。甚至甚至是一个终端仿真器,运行不执行任何操作的程序(cat > /dev/null)。键入几行不同长度的单词,每行后面都有一个制表符,观察它们如何对齐,以及当一个单词足够长以占据2个表列时会发生什么。继续使用它,直到您对制表符的功能有了直观的了解。

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

在文本编辑器中,返回新行的开头,键入 1 2 Tab 3 4 。您将1234分隔成由制表符组成的一些空格。然后开始另一行,并在选项卡之前的空格处键入相同的内容: 1 2 space Tab < kbd> 3 4 。第二行看起来与第一行完全相同,但是这次1234之间的空格由空格和制表符组成。通过键入 space 直到它对齐,使第三行看起来相同而不使用任何选项卡。

这3行是对练习1-21程序可能输入的示例。第一个只有一个选项卡且没有空格的字符使用最少的字符数,因此这是您要为所有3个输入输出的字符。

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