在 win10 上使用 qt5.6 和 (mingw 5.3.0 32bit) 时,我遇到了一个涉及 snprintf() 的令人困惑的问题。
我的代码如下:
char *my3DesCBC_Decode_default(char *in_24char_CipherTxt,
char *out_32char_PlainTxt) {
int xLen = 24; // default:24;
int len001 = 0;
unsigned char *res_PlainTxt;
unsigned char *res_decode_Base64;
base64_de((unsigned char *)in_24char_CipherTxt, &res_decode_Base64, &xLen);
if (des_decode(DES3_CBC, pmingKey16_default, pmingKeyLen_default,
pmingVI008_default, res_decode_Base64, &res_PlainTxt,
&xLen) == RESULT_OK) {
xLen = xLen > 30 ? 30 : xLen; // `xLen`: true length of decrypted string
snprintf(out_32char_PlainTxt, xLen + 0, "%s", res_PlainTxt); // problem from this line
len001 = strlen(out_32char_PlainTxt);
printf("3DES CBC DECODE:%s ;Len=%d,%d\n", out_32char_PlainTxt, xLen,
len001);
}
}
线路
snprintf(out_32char_PlainTxt, xLen + 0, "%s", res_PlainTxt);
有效。不过根据文档,这里的xLen + 0
应该是xLen + 1
。当我使用xLen + 1
时,它引发了一个错误,要使其再次运行,我必须编写
snprintf(out_32char_CipherTxt,xLen+1,"%s",res_encode_Base64);
\*(out_32char_CipherTxt + xLen) = '\0';
更具体地说,
xLen + 1
应该是正确的,因为需要另一个位来存储由'\0'
自动添加的eofsnprintf()
。我想知道为什么我必须自己添加'\0'
? snprintf()
在不同平台上有没有陷阱?
我不是 C++ 程序员,但我可以建议创建一个 mre 吗?:
#include <stdio.h>
int main ()
{
char input [25] = "abcdefghijklmnopqrstuvwx";
char output [100] ;
printf("strlen: %d\n", (int)sizeof(input));
printf("snprintf: %d\n", snprintf( output, 10, input));
printf("input: %s\n", input);
printf("output: %s\n", output);
return 0;
}
输出:
strlen: 25
snprintf: 24
input: abcdefghijklmnopqrstuvwx
output: abcdefghi
当第二个参数为10时,结果将为9个字符长(
abcdefghi
)。
(我的)结论:
当您使用时遇到问题时:
snprintf(out_32char_PlainTxt, xLen + 0, "%s", res_PlainTxt); // problem from this line
而问题是结果太小了1个字符,那么你可以使用
xLen + 1
。
但这似乎是相当标准的 C++,(我重复一遍:)我不是 C++ 程序员! 😉