Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C snprintf等函数中的大小混淆_C_Printf_Sizeof_Size T - Fatal编程技术网

C snprintf等函数中的大小混淆

C snprintf等函数中的大小混淆,c,printf,sizeof,size-t,C,Printf,Sizeof,Size T,在像snprintf、strlcat和strlcpy这样的函数中,它们的主页在所述函数的参数中提到了size\u t size,那么size到底是什么,或者获得size的最佳方法是什么 摘自strlcpy(3),strcat(3),以及printf(3)(添加注释) 我的理解是,size可以(或者在strncat的情况下,应该?)这样获得: sizeof dst - strlen(dst) - 1 // sizeof dst buffer, minus the offset of '\0',

在像
snprintf
strlcat
strlcpy
这样的函数中,它们的主页在所述函数的参数中提到了
size\u t size
,那么
size
到底是什么,或者获得
size
的最佳方法是什么

摘自
strlcpy(3)
strcat(3)
,以及
printf(3)
(添加注释) 我的理解是,
size
可以(或者在
strncat
的情况下,应该?)这样获得:

sizeof dst - strlen(dst) - 1 
// sizeof dst buffer, minus the offset of '\0', minus 1 for the null-terminator
但我记得我在某个地方读过,为了得到变量的
大小,你做了如下操作:

sizeof <VAR> / <SOMETHING ELSE?>
// sorry, I don't remember the rest of this method
sizeof/
//对不起,我不记得这个方法的其余部分了
这两种形式之间是否存在差异,它们是否等效和/或可互换,或者它们是否仅在某些情况下有效

编辑
我想我现在明白多了
sizeof
返回传递给它的任何内容的大小(以字节为单位),但在同样的情况下,除了源缓冲区的大小之外,还需要考虑目标缓冲区的大小,如
strncat
的情况

对于strlcpy,您可以为它指定缓冲区的大小。如果缓冲区大小为100,strlcpy最多可以复制99个字符加上一个零字节

对于strlcat,您为它指定缓冲区的大小。strlcat计算出已经有多少字节


strlcpy、strlcat、snprintf的全部要点是,你给它缓冲区的大小,函数计算出其余的,而不是你计算有多少字节可用。这是因为计算大小的人会犯错误,所以调用strlcpy并自己计算可用字节数就无法达到目的

对于strlcpy,您可以为它指定缓冲区的大小。如果缓冲区大小为100,strlcpy最多可以复制99个字符加上一个零字节

对于strlcat,您为它指定缓冲区的大小。strlcat计算出已经有多少字节


strlcpy、strlcat、snprintf的全部要点是,你给它缓冲区的大小,函数计算出其余的,而不是你计算有多少字节可用。这是因为计算大小的人会犯错误,所以调用strlcpy并自己计算可用字节数就无法达到目的

大小\u t通常(但不总是)可以被视为无符号int。它用于可移植性。sizeof是一个编译时运算符,返回某个对象中的字节数。您的示例:sizeof/通常通过编码:sizeof(table)/sizeof(table中的单个条目)@user3629249来获取表中的条目数,因为它被指定为无符号整数类型。strlen(dst)(对于以nul结尾的字符串)获取字符串末尾nul字节的偏移量。但是,由于偏移量以0开头,因此它也是字符串中的字节数。给定这一行:“sizeof dst-strlen(dst)-1”,这实际上给出了dst中未被(字符串+nul终止符字节)占用的字节数也就是说,如果dst为30字节,strlen返回20字节,则未使用字节的计数为:30-20-1=9未使用字节
size\t
是一种
无符号的
类型,能够存储最大可能对象的大小。希望它至少是
unsigned int
(不保证,由于默认的整数提升,建议使用),尽管它可以是
unsigned long
。大小通常(但不总是)可以被视为unsigned int。它用于可移植性。sizeof是一个编译时运算符,返回某个对象中的字节数。您的示例:sizeof/通常通过编码:sizeof(table)/sizeof(table中的单个条目)@user3629249来获取表中的条目数,因为它被指定为无符号整数类型。strlen(dst)(对于以nul结尾的字符串)获取字符串末尾nul字节的偏移量。但是,由于偏移量以0开头,因此它也是字符串中的字节数。给定这一行:“sizeof dst-strlen(dst)-1”,这实际上给出了dst中未被(字符串+nul终止符字节)占用的字节数也就是说,如果dst为30字节,strlen返回20字节,则未使用字节的计数为:30-20-1=9未使用字节
size\t
是一种
无符号的
类型,能够存储最大可能对象的大小。希望它至少是
unsigned int
(不保证,由于默认的整数提升,建议使用),尽管它也可以是
unsigned long
sizeof <VAR> / <SOMETHING ELSE?>
// sorry, I don't remember the rest of this method