2014-06-29 25 views
2

我目前正在研究一個字符串度量庫,它計算字符串之間的各種距離並報告字符串彼此之間的相似程度。例如Levenshtein距離(https://en.wikipedia.org/wiki/Levenshtein_distance)。好的做法來檢查參數是否爲空

unsigned levenshtien(const char *str1, const char *str2) 
{ 
    // check for NULL pointers 
    if (str1 == NULL && str2 == NULL) 
     return 0; 

    if (str1 != NULL && str2 == NULL) 
     return strlen(str1); 

    if (str1 == NULL && str2 != NULL) 
     return strlen(str2); 

    // calculate length of strings 
    size_t str1_len = strlen(str1); 
    size_t str2_len = strlen(str2); 

    // handle cases where one or both strings are empty 
    if (str1_len == 0) 
     return (str2_len == 0) ? 0 : 1; 

    // calculate stuff here... 
} 

庫中的每個函數都通過const char *指針。我想知道是否通常的做法是檢查每個指針是否爲NULL?或者我應該假設使用庫的程序員在傳遞指針之前會檢查嗎?

回答

6

它取決於記錄的界面。如果該函數被記錄爲採用兩個非空字符串,那麼您可以添加一個斷言,表明它們不爲空,並且無需進一步檢查即可繼續使用。如果函數被記錄爲將空指針視爲空字符串,或者類似的東西,那麼這就沒有問題,您必須根據需要進行檢查和調整。即使函數被記錄爲將非空指針指向有效的以空字符結尾的字符串,但檢查並處理無效參數時沒有任何問題,但它使您的代碼變得更加龐大,對於那些可以閱讀文檔的用戶來說,它們的利益微乎其微。

標準C庫函數(如strcmp())只需要參數爲有效字符串。如果您向它傳遞空指針,則會調用未定義的行爲。它可能會崩潰,或者不會,這是實施者的心血來潮。

對於你的函數,用戶只提供有效的指針似乎是合理的;一個讓他們誠實的斷言是很好的,這就是所需要的。

0

總是檢查潛在的錯誤情況並適當地處理它們(拋出異常,返回錯誤代碼,什麼都不做等)。沒有空指針異常不是一件好事。