计算字符串长度的不同方法
对我的一个答案的评论让我有点困惑。当试图计算将两个字符串连接到一个新的内存块需要多少内存时,据说使用
snprintf
优于strlen
,如下所示:
size_t length = snprintf(0, 0, "%s%s", str1, str2);
// preferred over:
size_t length = strlen(str1) + strlen(str2);
我可以在这背后得到一些推理吗?有什么优势,如果有的话,有人会看到一个结果与另一个结果不同吗?
没有找到相关结果
已邀请:
7 个回复
埃庐
,这篇评论是快速而粗心地写的,所以让我解释一下。我的观点仅仅是你应该使用相同方法的模式来计算最终用于填充字符串的长度,而不是使用两种可能在细微方面存在差异的不同方法。 例如,如果你有三个字符串而不是两个字符串,并且它们中的两个或多个重叠,则
可能超过
并且包裹过零,导致输出分配不足和截断(如果使用
)或非常危险的内存损坏(如果使用
和
)。 当结果字符串长于
时,
将返回
,so11ѭ,因此您受到保护。您确实需要在使用它之前检查返回值,并为null终止符添加一个。
膝垫富顷
,因为确定两个字符串的总长度的最小操作是两个
调用所做的。
几乎肯定会慢一些,因为它必须检查参数并解析格式字符串,而不仅仅是走两个字符串来计算字符。 ...但是...如果你想要连接两个字符串,并且有一个静态的,不是太大的缓冲区来处理正常情况,那么使用ѭ0可能是一个聪明的举动,但你可以回退到在大字符串的情况下动态分配缓冲区,例如:
犁攀富
内)而不是两次用于
/
解决方案。 实际上,在重读这个问题以及对你之前的答案的评论时,我看不出使用
只是为了计算连接的字符串长度有什么意义。如果您实际上正在进行连接,我的上一段适用。
链眷克袒姜
倪蕊悲潍
耐钨徒
良阑纠苫
可能导致分段错误,而(至少glibc)
可以处理
参数而不会失败。 因此,使用glibc-
你不需要检查其中一个字符串是否为
,虽然
可能略大于所需,因为(至少在我的系统上)
打印“(null)”而不是什么。 我不建议使用
而不是
。这不是很明显。一个更好的解决方案是
的包装器,当参数为
时返回0: