2014-06-29 24 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

总是检查潜在的错误情况并适当地处理它们(抛出异常,返回错误代码,什么都不做等)。没有空指针异常不是一件好事。