c - 为什么这个例子在字符串比较中使用空填充? “Programming Pearls” : Strings of Pearls

标签 c string suffix-array programming-pearls

在“编程珍珠”中:珍珠串,section 15.3 (Generating Text),作者介绍了如何从一个输入文档中生成随机文本。在source code ,有些东西我不明白。

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

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

最佳答案

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

 alphabet
 alpha___

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

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

  1. 这是用 C 写的。C 不保护它的数组边界;您可以读取超出为其分配的空间的任何垃圾数据,而且您永远听不到任何声音。
  2. 您的输入文档是这样制作的,您永远不会比较两个字符串,其中一个是另一个的前缀(就像 alphaalphabet)。

关于c - 为什么这个例子在字符串比较中使用空填充? “Programming Pearls” : Strings of Pearls,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13245050/

相关文章:

代码执行无法继续,因为找不到 libquickmail-0.dll?

c - C 编译器是否假设有符号整数的加法是可交换的?

c# - 如何将 JSON 值分配给字符串变量

python - 删除字符串中除第一次出现以外的所有出现

python - 有没有更好的方法在 python 中屏蔽信用卡号?

algorithm - 使用后缀数组的最小字典序旋转

c - 如何使用 C 增加 16 位机器中变量的潜在值

algorithm - 我们如何从 LCP 阵列构建 LCP-LR 阵列?

java - 导致给定后缀数组的不同字符的最小数量

c - 编译此代码时出现错误