Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
strcat()与sprintf()的比较_C_Coding Style - Fatal编程技术网

strcat()与sprintf()的比较

strcat()与sprintf()的比较,c,coding-style,C,Coding Style,什么会更快?这: sprintf(&str[strlen(str)], "Something"); 或 性能有什么不同吗 strcat会更快,因为sprintf必须首先扫描字符串以查找格式变量 但真正的胜利在于,每个人都知道strcat在做什么——串接字符串。使用sprintf进行连接不是标准用法。这会让人们加倍努力 考虑到两者之间的选择,我会选择strcat;它当然更具可读性,让你的意图更加清晰。它也可能比sprintf快一点,但可能不会快很多 但是,无论您选择哪种方法,都必须使用s

什么会更快?这:

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


性能有什么不同吗

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


但真正的胜利在于,每个人都知道strcat在做什么——串接字符串。使用
sprintf
进行连接不是标准用法。这会让人们加倍努力

考虑到两者之间的选择,我会选择strcat;它当然更具可读性,让你的意图更加清晰。它也可能比sprintf快一点,但可能不会快很多

但是,无论您选择哪种方法,都必须使用
snprintf
strncpy
进行缓冲区溢出保护


您将此问题标记为
c
c++
;如果使用C++,则最好使用<代码> STD::String 。

< P>如果有不同之处,则根据编译器标志、代码运行时的计算机使用、库实现、…、……/ P的不同而有所不同。 对于您的具体情况,测量
将这两个代码段运行数十亿次并计时

我很怀疑你会发现有什么显著的不同


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

strcat
在这种情况下要快得多。请记住,
sprintf()
逐个字符解析格式字符串,查找%转义。将此与:

strcpy (str + strlen (str), "Something");

例如。

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

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

跟踪字符串的结尾。附加字符串时,只需跳到末尾并复制它。如果分配的内存不够大,则加倍
max
。或者,通过将
len
max
str
打包在一起,您可能会有点花哨。

@Jonathan Feinberg-这不是堆栈溢出的部分原因吗?当然,他可能会发起一个性能测试,但如果其他人已经做了,为什么要重新发明轮子呢?请注意,sprintf的良好用途是
sprintf(str,“%s”,other_str)
,而不是
sprintf(str,other_str)
,否则您可能会面临格式字符串漏洞的风险strncpy()可以让你没有终结者。strlcpy()或strlcat()会更好。
typedef struct { size_t len, max; char *str; } mystring_t;