为啥此示例在字符串比较中使用空填充? “编程珍珠”:一串串珍珠
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 不保护其数组边界;您可以读取超出为其分配的空间的任何垃圾数据,而且您什么也听不到。
您的输入文档不会比较两个字符串,其中一个是另一个的前缀(例如
alpha
是 alphabet
)。
【讨论】:
+1。这个概念叫做sentinel values @KenoguLabz,末尾的空填充是针对单词数组的最后一个元素的,它只指向句子的最后一个单词。如果 k = 2 并且有一个与最后一个相同的前词,那么在没有空填充的情况下进行比较就会出现问题。但正如 Lundin 所说,一个空填充就足够了。非常感谢。以上是关于为啥此示例在字符串比较中使用空填充? “编程珍珠”:一串串珍珠的主要内容,如果未能解决你的问题,请参考以下文章