C++ 保兑问题+;snprintf在C+中的用法+;

C++ 保兑问题+;snprintf在C+中的用法+;,c++,C++,修复以下覆盖率错误。这里是我应该使用的第二个参数大小 sizeof(empID)-1还是sizeof(empID)?我应该减去1来删除空字符吗? 例: 覆盖率输出: 调用危险函数(安全编码)[非常危险]。使用“sprintf” 如果操作不正确,可能导致缓冲区溢出。因为sprintf() 假设字符串任意长,调用方必须小心不要 溢出目标的实际空间。改为使用snprintf(), 或正确的精度说明符 函数snprintf()和vsnprintf()最多向str写入大小字节(包括终止的空字节('\0')

修复以下覆盖率错误。这里是我应该使用的第二个参数大小 sizeof(empID)-1还是sizeof(empID)?我应该减去1来删除空字符吗? 例:

覆盖率输出:

调用危险函数(安全编码)[非常危险]。使用“sprintf” 如果操作不正确,可能导致缓冲区溢出。因为sprintf() 假设字符串任意长,调用方必须小心不要 溢出目标的实际空间。改为使用snprintf(), 或正确的精度说明符

函数snprintf()和vsnprintf()最多向str写入大小字节(包括终止的空字节('\0'))


因此无需减去1,大小已经包括空终止符。

不要认为必须减去1。我只是用这个测试了一下

 void main(){
     char ch_1[5];
     strcpy(ch_1, "1234");
     snprintf(ch_1, sizeof(ch_1), "abcdefg");
     printf("ch_1=%s\n", ch_1);
 }
sizeof(ch_1)
在此处返回
5
snprintf
自动减去一个字符,即它将其解释为“复制
5-1=4个
字符,并在第5个位置放置空终止符”


结果是Chu_1=abcd

为什么不阅读?很明显,Coverity报告是关于你没有显示的代码的。这甚至与你的问题有关吗?你的问题似乎是“我如何使用snprintf()”答案可能是“阅读精美手册”,谢谢你提供的信息。这非常有帮助。顺便说一句,在一些地方,我看到它被用sizeof(str)-1表示大小。通常在什么情况下它需要减去“-1”“@Sudhakar:你可能会想到strncpy(),它无论如何都是一个可怕的函数,因为它根本不总是放置空终止符。
 void main(){
     char ch_1[5];
     strcpy(ch_1, "1234");
     snprintf(ch_1, sizeof(ch_1), "abcdefg");
     printf("ch_1=%s\n", ch_1);
 }