strncpy和snprintf之间的区别?

问题描述 投票:3回答:2

有什么区别

strncpy(dst, src, n)

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

在尝试进行有限的字符串复制时,我应该更喜欢其中一个吗?为什么?

c
2个回答
5
投票

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

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

请注意,snprintf的简单使用并不是“有界”的,因为它限制了从源读取的数量;它必须读取整个源字符串以确定返回值,这两者都会产生时间成本,并且取决于源是有效(终止)字符串。如果你想在源和目的地的意义上限制它,你可以做类似的事情:

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

然而,这是非常惯用且容易出错的,我只会使用strnlenmemcpy


3
投票

使用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)副本

© www.soinside.com 2019 - 2024. All rights reserved.