在「編程珍珠」:珍珠串,section 15.3(生成文本)中,作者介紹瞭如何從輸入文檔生成隨機文本。在source code,有一些我不明白的東西。爲什麼此示例在字符串比較中使用空填充? 「編程珍珠」:珍珠串
for (i = 0; i < k; i++)
word[nword][i] = 0;
作者解釋說:「讀取輸入後,我們追加k個空字符(所以比較函數不會結束運行)。」這個解釋讓我很困惑,因爲它在評論這兩行後仍然很好。爲什麼這是必要的?
在「編程珍珠」:珍珠串,section 15.3(生成文本)中,作者介紹瞭如何從輸入文檔生成隨機文本。在source code,有一些我不明白的東西。爲什麼此示例在字符串比較中使用空填充? 「編程珍珠」:珍珠串
for (i = 0; i < k; i++)
word[nword][i] = 0;
作者解釋說:「讀取輸入後,我們追加k個空字符(所以比較函數不會結束運行)。」這個解釋讓我很困惑,因爲它在評論這兩行後仍然很好。爲什麼這是必要的?
這樣做可以減少在進行逐字符比較時必須處理的奇怪情況的數量。
alphabet
alpha___
如果通過在此時間一個字母階梯,並在alpha
末尾空填充不在那裏,你會嘗試檢查下一個元素... ...而流失結束的陣列。 null填充基本上可以確保當一個單詞中有一個字符時,另一個字符中就會有相應的字符。而且由於空字符的值爲0,所以較短的單詞總是被認爲是'小於'的那個更長的單詞!
至於爲什麼它似乎沒有那些線工作,還有我能想到的有兩個關聯的原因:
alpha
是alphabet
)。+1。名爲[sentinel values]的概念(http://en.wikipedia.org/wiki/Sentinel_value) –
@KenoguLabz,最後的空填充是字數組的最後一個元素,它只指向最後一個單詞這句話。如果k = 2並且有一個與最後一個相同的前一個單詞,那麼在沒有null填充的情況下會有比較問題。但正如倫丁所說,一個零填充就足夠了。非常感謝。 – Fihop
正如在另一個答案中已經解釋的那樣,目的是以null結束字符串。
但我讀了發佈的鏈接,並沒有任何意義。如果我們看一下使用的比較函數,那麼在這種情況下,爲什麼整個字符串必須用零填充是沒有道理的。沒有for循環的普通word[nword][0] = 0;
將工作得很好。或者優選地:
word[nword][0] = '\0';
用零填充整個字符串將會增加相當多的開銷執行時間。
@KenoguLabz,非常感謝您的編輯。 – Fihop