为啥此示例在字符串比较中使用空填充? “编程珍珠”:一串串珍珠

Posted

技术标签:

【中文标题】为啥此示例在字符串比较中使用空填充? “编程珍珠”:一串串珍珠【英文标题】:Why does this example use null padding in string comparisons? “Programming Pearls”: Strings of Pearls为什么此示例在字符串比较中使用空填充? “编程珍珠”:一串串珍珠 【发布时间】:2012-10-26 01:16:03 【问题描述】:

在 "Programming Pearls": Strings of Pearls, section 15.3 (Generating Text) 中,作者介绍了如何从输入文档中生成随机文本。在source code,有一些我不明白的地方。

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

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

【问题讨论】:

@KenoguLabz,非常感谢您的编辑。 【参考方案1】:

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

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

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

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

【讨论】:

这是真的。或许作者并没有意识到第一次比较会得出结论,而不是在做出决定之前检查所有字符。它也可能特定于这个问题;我将不得不仔细研究书中提出的问题和解决方案。 @KenoguLabz 作者似乎对如何存储数据感到困惑。他希望在某处静态分配一个巨大的数组,这对大多数系统来说可能是个大问题。 @Lundin,我很难决定哪个是答案,因为你们俩都给出了一些有用的观点。由于Kenogu很早就回答了,所以我标记了他的回答。感谢您的帮助。 @FihopZz 确实,他给出了正确的答案,所以选择他的帖子 :) 我只是添加了额外的主题信息。【参考方案2】:

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

 alphabet
 alpha___

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

至于为什么它似乎没有这些行,我能想到两个相关的原因:

    这是用 C 编写的。C 不保护其数组边界;您可以读取超出为其分配的空间的任何垃圾数据,而且您什么也听不到。 您的输入文档不会比较两个字符串,其中一个是另一个的前缀(例如 alphaalphabet)。

【讨论】:

+1。这个概念叫做sentinel values @KenoguLabz,末尾的空填充是针对单词数组的最后一个元素的,它只指向句子的最后一个单词。如果 k = 2 并且有一个与最后一个相同的前词,那么在没有空填充的情况下进行比较就会出现问题。但正如 Lundin 所说,一个空填充就足够了。非常感谢。

以上是关于为啥此示例在字符串比较中使用空填充? “编程珍珠”:一串串珍珠的主要内容,如果未能解决你的问题,请参考以下文章

使用更多空间编程珍珠的恒定时间初始化 - 第 1 列

编程珍珠中的词频

旋转序列的两种算法的速度。 (摘自《编程珍珠》一书)

NodeJS 模块 - 填充数组变成空对象。为啥?

为啥 MongoDB 填充方法在此应用程序中失败?

为啥 mongoosastic 填充/弹性搜索没有填充我的参考资料之一?我得到一个空对象