2012-11-06 26 views
0

在「編程珍珠」:珍珠串,section 15.3(生成文本)中,作者介紹瞭如何從輸入文檔生成隨機文本。在source code,有一些我不明白的東西。爲什麼此示例在字符串比較中使用空填充? 「編程珍珠」:珍珠串

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

作者解釋說:「讀取輸入後,我們追加k個空字符(所以比較函數不會結束運行)。」這個解釋讓我很困惑,因爲它在評論這兩行後仍然很好。爲什麼這是必要的?

+0

@KenoguLabz,非常感謝您的編輯。 – Fihop

回答

2

這樣做可以減少在進行逐字符比較時必須處理的奇怪情況的數量。

alphabet 
alpha___ 

如果通過在此時間一個字母階梯,並在alpha末尾空填充不在那裏,你會嘗試檢查下一個元素... ...而流失結束的陣列。 null填充基本上可以確保當一個單詞中有一個字符時,另一個字符中就會有相應的字符。而且由於空字符的值爲0,所以較短的單詞總是被認爲是'小於'的那個更長的單詞!

至於爲什麼它似乎沒有那些線工作,還有我能想到的有兩個關聯的原因:

  1. 這是用C寫的C不保護其數組邊界;你可以閱讀任何垃圾數據超出分配給它的空間,你永遠不會聽到任何東西。
  2. 你的輸入文檔是這樣製作的,你永遠不會比較兩個字符串,其中一個是另一個的前綴(如alphaalphabet)。
+1

+1。名爲[sentinel values]的概念(http://en.wikipedia.org/wiki/Sentinel_value) –

+0

@KenoguLabz,最後的空填充是字數組的最後一個元素,它只指向最後一個單詞這句話。如果k = 2並且有一個與最後一個相同的前一個單詞,那麼在沒有null填充的情況下會有比較問題。但正如倫丁所說,一個零填充就足夠了。非常感謝。 – Fihop

3

正如在另一個答案中已經解釋的那樣,目的是以null結束字符串。

但我讀了發佈的鏈接,並沒有任何意義。如果我們看一下使用的比較函數,那麼在這種情況下,爲什麼整個字符串必須用零填充是沒有道理的。沒有for循環的普通word[nword][0] = 0;將工作得很好。或者優選地:

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

用零填充整個字符串將會增加相當多的開銷執行時間。

+0

這是真的。也許作者沒有意識到它在第一次比較時會得出結論,而不是在做出決定之前檢查所有角色。這也可能是特定的問題;我將不得不仔細看看本書中提出的問題和解決方案。 –

+0

@KenoguLabz作者似乎對如何一般存儲數據感到困惑。他希望將一個巨大的數組靜態分配到某個地方,這對大多數系統來說可能是一個大問題。 – Lundin

+0

@Lundin,非常感謝。 word [nword] [0] ='\ 0'就足夠了 – Fihop

相關問題