11

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

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

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

我的问题不在于如何执行程序......我的问题是我应该在哪里折叠线。

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

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

我只想知道我应该折叠线的位置。

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

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

编辑 2

一些聪明的东西......为了解决标签的情况,我有一个想法......

1-22之前有2个练习——1-20和1-21。哪个是entab 和detab ......你们一定知道......所以我将首先detab 线然后折叠它,然后entab 折叠线......我认为这将是最聪明的选项卡。任何人?

4

2 回答 2

9

我认为这个练习基本上是在模拟您可能在文本编辑器上看到的“自动换行”功能。“空白”表示“空白”,例如空格或制表符。

例子:

"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",因此应该拆分该单词。

最后,我同意这个问题有点模棱两可,但只要你在某种程度上按照要求编写代码,你就是在学习,所以我不会担心过于挂断细节。祝你好运 :)

于 2013-02-10T12:32:39.833 回答
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
于 2013-02-10T12:45:27.280 回答