有什么区别
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
和memcpy
。
使用snprintf(dst, n "%s", src)
。
snprintf(dst, n "%s", src)
确定dst
是空字符终止。 strncpy(dst, src, n)
不这样做。
strncpy(dst, src, n)
总是做n
副本而snprintf(dst, n "%s", src)
做min(strlen(src),n)
副本