我正在使用Kernighan和Ritchie的C编程语言编写程序。
我目前正在练习1-22,其中说:
编写一个程序,在输入第n列之前的
last > non-blank character
后,将长输入行“折叠”成两条或更多条较短的行。 确保你的程序在非常长的行中做一些智能的事情,如果有>指定列之前没有空格或制表符。
我的问题不是如何做这个程序...... 我的问题是我应该在哪里弃线。
“最后一个非空白字符后”是什么意思?我应该在哪里折线?
请大家不要告诉我程序本身。我想自己做。
我只是想知道我应该折叠线的地方。
编辑:还有另一个问题......
如果我的专栏包含tabs
怎么办?在这种情况下,线的列长度从字符长度开始增加。应该考虑哪个长度?
编辑2 :
聪明的东西...... 为了解决标签的问题,我有一个想法......
在1-22 - 1-20和1-21之前有2次运动。哪些是entab和detab ...你们一定要知道......所以我先将线条分开然后折叠然后折叠折叠的线条......我认为如果有标签,这将是最聪明的。任何人?
答案 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