首页 > 解决方案 > strncpy 和 snprintf 之间的区别?

问题描述

和有什么区别

strncpy(dst, src, n)

snprintf(dst, n, "%s", src)

在尝试进行有界字符串复制时,我应该更喜欢其中一个吗?如果是这样,为什么?

标签: c

解决方案


strncpy 不是有界的strcpy。这是一个固定长度(无界,固定长度)的操作,其目标不是 C 字符串(以空结尾)而是空填充字段,就像 70 年代和早期在某些类型的数据记录表中使用的那样80 年代。它基本上没有现代用途,除非您真的想要这种行为,否则不应使用它。

snprintf是“有界strcpy”的规范 C 函数。在 POSIX 系统上,strnlen+memcpy将是另一个不错的选择,如果您需要支持比INT_MAX. 如果您没有strnlen,您可以轻松地使用它memchr并做同样的事情。

请注意,在snprintf从源读取多少的意义上,简单的使用不是“有界的”;它必须读取整个源字符串以确定返回值,这既会产生时间成本,又取决于源是有效(终止的)字符串。如果您希望它在源和目标的意义上有界,您可以执行以下操作:

snprintf(dest, n, "%.*s", (int)n-1, src);

但是,这足够不惯用且容易出错,我只会使用strnlenandmemcpy来代替。


推荐阅读