我正在实现一个功能,我希望它是一个“库质量”功能:
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库的大型应用程序来说并不好。
问题:有更好的解决方案吗?
答案 0 :(得分:1)
我建议使用malloc
的包装器,假设xmalloc
(或calloc
的某个等价物),返回NULL
,导致内存不足的情况应用程序的责任 - 或终止申请。前者是强大的便携式库的理想选择。然而,在现代操作系统的背景下,后者是相当合理的;当发生OOM错误时,应用程序会遇到严重问题,无论如何都可能无法恢复。 xmalloc
可以尝试执行一些清理,保存关键数据等。
答案 1 :(得分: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;
}
BTW:如果字符串一或两个不获得malloc(),则此函数也应该有效;因此不应该被释放。这样
char *onetwo;
onetwo = my_catcat( "eins", "zwo");
应该有效。 (将const添加到参数中以获得额外的乐趣)