【问题标题】:K and R exercise 1-22K 和 R 练习 1-22
【发布时间】:2013-02-10 12:30:05
【问题描述】:

我正在用 Kernighan 和 Ritchie 编写的 The C Programming Language 编写程序。

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

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

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

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

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

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

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

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

编辑 2

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

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

【问题讨论】:

  • “请大家不要告诉我程序本身。我想自己做。” - 这本身就值得一票。
  • 空白字符都是空格的形式。它基本上是要求您不要将单词一分为二。
  • 尝试折叠第 80 列之前最后一个非空白字符之后的行
  • 只是这个Make sure your program does something intelligent with very long line有点模棱两可……是在告诉读者断章取义吗?
  • 完全正确:这就是为什么我在下面的回答中提到,如果练习有点模糊,你可以决定做什么。无论你决定做什么,你都会学到任何东西,所以尽可能多或少做你有信心做的事。

标签: c


【解决方案1】:

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

例子:

"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" 之前找不到任何空白字符,因此应该拆分该单词。

最后,我同意这个问题有点模棱两可,但只要你编写的代码有点符合要求,你就是在学习,所以我不会担心太挂-了解详情。祝你好运:)

【讨论】:

  • 这就是我感到困惑的地方......因为非空白意味着除了'','\t'和'\n'之外的任何东西。
  • 是的,所以你从第 n 列的最后一个字符“后退”处折叠,该字符不是空白的。这意味着你要往回走,直到你从你想要中断的位置找到一个空白 - 就在空格前面的那个中断。
  • @MatsPetersson 完美!同意!
【解决方案2】:

考虑这个例子:假设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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多