c - strncpy 和 snprintf 之间的区别?
问题描述
和有什么区别
strncpy(dst, src, n)
和
snprintf(dst, n, "%s", src)
在尝试进行有界字符串复制时,我应该更喜欢其中一个吗?如果是这样,为什么?
解决方案
strncpy
不是有界的strcpy
。这是一个固定长度(无界,固定长度)的操作,其目标不是 C 字符串(以空结尾)而是空填充字段,就像 70 年代和早期在某些类型的数据记录表中使用的那样80 年代。它基本上没有现代用途,除非您真的想要这种行为,否则不应使用它。
snprintf
是“有界strcpy
”的规范 C 函数。在 POSIX 系统上,strnlen
+memcpy
将是另一个不错的选择,如果您需要支持比INT_MAX
. 如果您没有strnlen
,您可以轻松地使用它memchr
并做同样的事情。
请注意,在snprintf
从源读取多少的意义上,简单的使用不是“有界的”;它必须读取整个源字符串以确定返回值,这既会产生时间成本,又取决于源是有效(终止的)字符串。如果您希望它在源和目标的意义上有界,您可以执行以下操作:
snprintf(dest, n, "%.*s", (int)n-1, src);
但是,这足够不惯用且容易出错,我只会使用strnlen
andmemcpy
来代替。
推荐阅读
- java - 有没有办法通过代码或命令行(JDK 9+)禁用原生 DPI 缩放?
- selenium - 如何使用 selenium Junit 验证页脚文本
- firebase - 错误:未找到请求的实体。在 FirebaseMessagingError.FirebaseError [作为构造函数]
- django-rest-framework - get_queryset 被执行而不是 get_object
- python - 如果两个区域相交,则合并它们
- vba - 使用 VBA 在whatsapp web 中发送图像
- python - python特征选择:chi2和chi2_contingency之间的矛盾
- html - 节点静态 Web 服务器页面中的奇怪标题(“b8”)
- selenium-chromedriver - 使用 selenium 将 URL 自定义 URL 传递给 chrome 驱动程序时出现“参数无效异常错误”
- python - 如何提高在 python 中发送请求的速度?`