在诸如snprintf
、strlcat
和strlcpy
这样的函数中,它们的manpage在所述函数的参数中提到了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
的情况一样。 最佳答案
对于strlcpy,可以给出缓冲区的大小如果缓冲区的大小为100,strlcpy最多可以复制99个字符加上零字节。
对于strlcat,你给它缓冲区的大小。strlcat计算出已经有多少字节。
strlcpy、strlcat、snprintf的要点是,给它一个缓冲区的大小,函数计算出其余的大小,而不是计算有多少字节可用。这是因为人们在计算大小时会出错,所以调用strlcpy并计算有多少字节是可用的,这样做会失败。
关于c - snprintf等函数中的size_t困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27629992/