K和R练习1-22

时间:2013-02-10 12:30:06

标签: c

我正在使用Kernighan和Ritchie的C编程语言编写程序。

我目前正在练习1-22,其中说:

  

编写一个程序,在输入第n列之前的last > non-blank character后,将长输入行“折叠”成两条或更多条较短的行。   确保你的程序在非常长的行中做一些智能的事情,如果有>指定列之前没有空格或制表符。

我的问题不是如何做这个程序...... 我的问题是我应该在哪里弃线。

“最后一个非空白字符后”是什么意思?我应该在哪里折线?

请大家不要告诉我程序本身。我想自己做。

我只是想知道我应该折叠线的地方。

编辑:还有另一个问题......

如果我的专栏包含tabs怎么办?在这种情况下,线的列长度从字符长度开始增加。应该考虑哪个长度?

编辑2

聪明的东西...... 为了解决标签的问题,我有一个想法......

在1-22 - 1-20和1-21之前有2次运动。哪些是entab和detab ...你们一定要知道......所以我先将线条分开然后折叠然后折叠折叠的线条......我认为如果有标签,这将是最聪明的。任何人?

2 个答案:

答案 0 :(得分:8)

我认为这个练习基本上是模仿你在文本编辑器上看到的“自动换行”功能。 “非空白”意味着“空白”,例如空间角色。

示例:

"Once upon a time"

如果要求在第14列输入后“折叠”该行,则第14个字符为“时间”中的“i”。您的输出应该是两行:"Once upon a", "time"

这个问题也说明了很长的路线是聪明的。

例如,

"Once upon a time Once upon a time Once upon a time"

如果您将此行拆分为14个字符,则应考虑该行必须拆分为两行以上的事实。

还有一种情况,即一个单词可能很长,阻止你分裂它:

"Deoxyribonucleicacid is DNA"

如果将其拆分为14个字符,则在" is"之前找不到任何空白字符,因此应该拆分该字。

最后,我同意这个问题有点含糊不清,但只要你按照所要求的方式编写代码,你就是在学习,所以我不会担心会过于担心详细说明。祝你好运:)

答案 1 :(得分:1)

考虑这个例子:让我们说n = 6(为了简单计算),你需要折叠的行看起来像这样:

Got all chars on one line.
00000000001111111111222222
01234567890123456789012345

浏览计算您正在生成的行中当前位置的字符。当你看到一个空格时,回过头去找之前的最后一个非空格字符,然后找到它的位置。当您的计数器到达n时,请查看原始行中空格之前的最后一个非空白字符在哪里,然后折叠该行。

在上面的示例中,您看到的第一个空格位于位置3.此时,您返回一个字符,将2标记为空格前的最后一个非空格,然后继续。当计数达到6(在字符'l'处)时,将线分割为位置3,并将当前位置重置为零。继续算法折叠7,13和20。

Got
all
chars
on one
line