在snprintf
,strlcat
和strlcpy
等函数中,其联机帮助页在所述函数的参数中提及size_t size
,究竟是size
,或者获得size
的最佳方法是什么?
strlcpy(3)
,strcat(3)
和printf(3)
(已添加评论)size_t
strlcpy(char *dst, const char *src, size_t size);
// ^^^^
char *
strncat(char *str, const char *src, size_t n);
// ^
int
snprintf(char *str, size_t size, const char *format, ...);
// ^^^^
我的理解是size
可以(或者在strncat
的情况下,应该?)获得如此:
sizeof dst - strlen(dst) - 1
// sizeof dst buffer, minus the offset of '\0', minus 1 for the null-terminator
但是我记得在某个地方阅读,以获得你做过类似的变量的size
:
sizeof <VAR> / <SOMETHING ELSE?>
// sorry, I don't remember the rest of this method
这两种形式之间是否存在差异,它们是等同的和/或可互换的,还是仅在某些情况下有效?
修改:
我想我现在明白了一点。 sizeof
返回传递给它的任何内容的大小(以字节为单位),但在相同情况下,您需要将目标缓冲区的大小另外考虑到源缓冲区的大小,与strncat
的情况一样。
答案 0 :(得分:5)
对于strlcpy,您可以给它缓冲区的大小。如果缓冲区的大小为100,则strlcpy最多可以复制99个字符加零字节。
对于strlcat,您可以为其指定缓冲区的大小。 strlcat计算出已经有多少字节。
strlcpy,strlcat,snprintf的全部意义在于,你给它大小的缓冲区,函数计算出其余的,而不是你计算可用的字节数。那是因为计算大小的人会犯错误,所以调用strlcpy并计算自己可用的字节数就会失败。