`snprintf()`不加`'0'`的一个令人困惑的问题

问题描述 投票:0回答:1

在 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'
自动添加的eof
snprintf()
。我想知道为什么我必须自己添加
'\0'
snprintf()
在不同平台上有没有陷阱?

c++ printf qt5.9
1个回答
0
投票

我不是 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++ 程序员! 😉

© www.soinside.com 2019 - 2024. All rights reserved.