0

我正在实现一个函数,我希望它是一个“库质量”函数:

char** str_cat(char** const  str, const char * const other ){

    if(str==NULL) 
        return NULL;
    if(other==NULL) 
        return str;
    if(*str==NULL) 
        return str_cpy(str,other);

    char* tmp=(char*)calloc(1,strlen(*str)+strlen(other)+1);
    if(tmp==NULL) 
            return NULL;
    strcat(strcpy(tmp,*str),other); 
    *str=tmp;
    return str;     
}

这是 strcat() 函数的一个版本(不同的签名),可以处理任何极端用例。但是,我的内存不足故障处理方法不适用于大量使用丰富的 str_xxx() API 库的大型应用程序。

问题:有没有更好的解决方案?

4

2 回答 2

1

我会建议一个包装器malloc,比如说xmalloc(或一些等效的calloc),它返回NULL,使内存不足的情况成为应用程序的责任 - 或终止应用程序。对于健壮的、可移植的库来说,前者是一个不错的选择。然而,在现代操作系统的背景下,后者是相当合理的。当发生 OOM 错误时,应用程序会遇到严重问题,并且可能无论如何都无法恢复。xmalloc可能会尝试执行一些清理、保存关键数据等。

于 2012-12-08T18:00:06.370 回答
1

最好不要更改或释放参数,而是返回一个新分配的字符串:

char * mycatcat(char *one, char *two)
{
size_t len1, len2;
char *new;

if (!one && !two) return NULL;
len1 = (one) ? strlen (one) : 0;
len2 = (two) ? strlen (two) : 0;

new = malloc(1+ len1+ len2);
if (!new) return NULL;

if (len1) memcpy (new, one, len1);
if (len2) memcpy (new+len1, two, len2);
new[len1+len2] = 0;

return new;
}

顺便说一句:如果 malloc()没有获得字符串一或二,这个函数也应该起作用;因此不应该被释放。这样

char *onetwo;
onetwo = my_catcat( "eins", "zwo");

应该管用。(将 const 添加到参数中以获得额外的乐趣)

于 2012-12-08T18:32:43.403 回答