2013-09-21 36 views
2

我有对字符串执行操作的函数。例如,String *concat(s1, s2);这将转向s1 + s2并返回一个新的String。C检查NULL和错误处理

我想象另一个用户可以发送NULL参数。 我可以检查NULL。

if(s1 == NULL || s2 == NULL) 
    return NULL; 

而只是返回NULL。

或者我可以做与整个程序退出:

exit(EXIT_FAILURE); 

我认为,要解决的问题是退出功能,而不是返回任何的最佳途径。但是,如果我的用户期待字符串,我只是回来,不会他崩溃和烧伤?我也觉得打印给用户是一个坏主意。

我很想找到一种方法来退出函数,并在任何情况下允许程序继续执行。

+0

结合两个NULL字符串会产生另一个NULL字符串,所以混淆了什么。它应该*也是被调用者对输入进行消毒的责任。你需要确保*你*不会因无效输入而崩溃。 – devnull

+0

或者,您需要确保您_do_崩溃以查找无效输入 - 记录界面并声明它已被授予。快速失败也是一个好策略。 –

回答

1

由于C没有例外,您必须在返回值中指示错误条件。在这种情况下,为无效输入声音返回NULL就像一个不错的选项,您可以更改设计,以便返回错误代码和串联字符串:使函数接受三个参数,其中一个参数为out参数。

int concat(string s1, string s2, string *out) 

如果出现错误,函数将返回错误代码,否则将结果写入out参数。

+0

有点夸大了?任何有头脑来检查一个concat函数的返回码的人大概都可以确保在函数不处理的情况下不传递null! –

+1

@Joni C有一个伪异常机制:setjmp()和longjmp()。 – 0xBAADF00D

+0

@ 0xBAADF00D:你建议在'strcat'克隆中使用'longjmp'? –

1

它取决于是否允许NULL(按设计)输入值。如果是这样,您可以:

  • 返回NULL(如果它被允许返回值 - 大概是因为你认为它是允许的输入值)
  • 信号中的一些错误情况,通过返回状态代码,或使用errno

的某种如果空值是无效的值,然后传递NULL是程序员错误,以便检查必须由你的函数的调用者来完成。你可以使用前面两种方法,你也可以:

  • 利用“未定义的行为”,任何事情都可能发生。使用断言可能做到这一点的最好办法:

    #include <assert.h> 
    
    assert (str1 != NULL && str2 != NULL); 
    

使用断言具有优势,在发行bulds,您可以打开检查了,所以你没有任何性能损失。

现在重要的部分:无论采取哪条路线,都要清楚记录并坚持下去。