strcat()vs sprintf()

时间:2009-11-20 18:53:12

标签: c coding-style

什么会更快?这样:

sprintf(&str[strlen(str)], "Something");

strcat(str, "Something");

有任何性能差异吗?

5 个答案:

答案 0 :(得分:22)

strcat会更快,因为sprintf必须首先扫描字符串以查找格式变量。

但真正的胜利是每个人都知道strcat正在做什么 - 连接字符串。使用sprintf进行连接不是标准用法。它会让人们做双重拍摄。

答案 1 :(得分:10)

鉴于两者之间的选择,我选择strcat;它肯定更具可读性,使你的意图清晰。它也可能比sprintf略快,但可能不会太多。

但是,无论您选择哪种方法,都应该使用snprintfstrncpy进行缓冲区溢出保护。

您已将此问题标记为cc++;如果您使用的是C ++,那么使用std::string代替它会好得多。

答案 2 :(得分:6)

如果存在差异,那么差异会因编译器标志,代码运行时的计算机使用情况,库实现,...,......而异。

针对您的具体情况,衡量 将两个片段运行几十亿次并计时。

我非常怀疑你会发现任何重大差异。

我更喜欢strcat():它清楚地传达了代码的含义。

答案 3 :(得分:1)

在这种情况下,

strcat要快得多。请记住,sprintf()逐个字符地解析格式字符串,以查找%escapes。将其与:

进行比较
strcpy (str + strlen (str), "Something");

例如。

答案 4 :(得分:1)

我同意其他人:strcat()应该更快。但对于“最佳实践”,如果你真的关心速度,你就不应该使用。你最好有一个像这样的结构:

typedef struct { size_t len, max; char *str; } mystring_t;

跟踪字符串的结尾。附加字符串时,只需跳到最后并复制即可。如果分配的内存不够大,请加倍max。或者,通过将lenmaxstr打包在一起,您可能会有点想象。