我正在实现一个函数,我希望它是一个"库质量"函数:
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 库的大型应用程序来说并不好。
问:有更好的解决方案吗?
我会建议malloc
包装器,假设xmalloc
(或calloc
的等价物),它返回NULL
,使内存不足条件成为应用程序的责任 - 或终止应用程序。前者是强大的便携式图书馆的不错选择。然而,在现代操作系统的背景下,后者是相当合理的;发生 OOM 错误时,该应用程序遇到严重问题,并且可能无法恢复。 xmalloc
可以尝试执行一些清理,保存关键数据等。
最好不要更改或释放参数,而是返回一个新分配的字符串:
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");
应该工作。(在参数中添加常量以获得额外的乐趣)