在项目开发中经常会遇到要将两个字符串连接的情况,而通常的作法往往是使用:
sprintf(buf, "%s%s", str_a, str_b);
记得要使用sprintf()函数则需要添加<stdio.h>的头文件。
在内存中执行格式化输入输出的stdio接口sprintf(),首先会调用fmemopen()函数构造一个基于内存的FILE对象,然后,调用fprintf()等函数完成最终的格式化输入输出功能,最后销毁临时构建的FILE对象。因此,这些接口的开销较大;无论从空间复杂度看还是从时间复杂度看,都远大于strcat()、strcpy()等函数。因此,如果只是想完成字符串的串接大可不必调用STDIO接口,而应该调用其它的标准库函数。比如下方方法:
strcpy(buf, str_a); strcat(buf, str_b);
如果对性能仍不满足,则可以进一步优化以上字符串串接代码。strcat()首先会找到str_a的尾部,然后复制str_b的内容直到字符串末尾。但实际上,strcpy()函数在其内部实现中一定已经循环到了str_a的尾部,故而也知道str_a中签字串的尾部地址。然后,strcpy()函数并没有返回str_a中指向字符串尾部的指针,返回的却是buf本身。幸好,为满足这一需求,标准库特意增加了一个接口stpcpy(),该接口复制字符串并返回指向其尾部的指针:
#include <string.h> char *stpcpy(char *dest, const char *src);
我们可以进一步优化以上用来串接两个字符串的代码:
// sprintf(buf, "%s%s", str_a, str_b); char *p = stpcpy(buf, str_a); strcpy(p, str_b);
我要赚赏金
