1

在“Programming Pearls”:Strings of Pearls,第 15.3 节(生成文本)中,作者介绍了如何从输入文档中生成随机文本。在源代码中,有一些我不明白的东西。

for (i = 0; i < k; i++)
        word[nword][i] = 0;

作者解释说:“在读取输入后,我们附加了 k 个空字符(因此比较函数不会跑到最后)。” 这个解释真的让我很困惑,因为在评论这两行之后它仍然很好用。为什么这是必要的?

4

2 回答 2

4

这样做可以减少在进行逐个字符比较时必须处理的奇怪情况的数量。

 alphabet
 alpha___

如果您一次遍历这一个字母,并且末尾的空填充alpha不存在,您将尝试检查下一个元素......并直接从数组的末尾运行。空填充基本上确保当一个单词中有一个字符时,另一个单词中有一个对应的字符。而且由于空字符的值为 0,因此较短的单词总是会被视为“小于”较长的单词!

至于为什么它似乎在没有这些线路的情况下工作,我能想到两个相关的原因:

  1. 这是用 C 编写的。C 不保护它的数组边界;您可以读取超出为其分配的空间的任何垃圾数据,而且您什么也听不到。
  2. 您的输入文档是这样制作的,您永远不会比较两个字符串,其中一个是另一个的前缀(例如alphais to alphabet)。
于 2012-11-06T05:54:34.090 回答
4

正如另一个答案中已经解释的那样,目的是空终止字符串。

但是我阅读了发布的链接,并且该循环没有意义。如果看一下使用的比较函数,在这种情况下,没有理由必须用零填充整个字符串。word[nword][0] = 0;没有 for 循环的平原也可以正常工作。或者最好:

word[nword][0] = '\0';

用零填充整个字符串会增加相当多的开销执行时间。

于 2012-11-06T07:42:27.457 回答