在诸如snprintfstrlcatstrlcpy这样的函数中,它们的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/

10-11 23:22