在C中使用sprintf_s时运行时检查失败

kmbjn2e3  于 2023-06-05  发布在  其他
关注(0)|答案(1)|浏览(136)

我想使用'sprintf()'连接字符串,但运行时检查失败(变量'szBuffer1'周围的堆栈已损坏)。

void main()
{
    char szBuffer1[128] = { 0 };
    char szBuffer2[16] = { 0 };

    gets_s(szBuffer1, sizeof(szBuffer1));
    gets_s(szBuffer2, sizeof(szBuffer2));

    sprintf_s(szBuffer1 + strlen(szBuffer1), sizeof(szBuffer1), "%s", szBuffer2);

    puts(szBuffer1);
    printf("%d", strlen(szBuffer1));

}

我认为这是堆栈溢出问题,所以我将'szBuffer1'的内存大小从64增加到128,但它不起作用。

zte4gxcn

zte4gxcn1#

给定输入:

Hello

声明:

sprintf_s(szBuffer1 + strlen(szBuffer1), sizeof(szBuffer1), "%s", szBuffer2);

将相当于:

sprintf_s (szBuffer1 + 5, 128, "%s", szBuffer2);

但缓冲区中剩余的字节是128 - 5,而不是128。将其更改为:

const size_t len = strlen (szBuffer1);
sprintf_s (szBuffer1 + len, sizeof szBuffer1 - len, "%s", szBuffer2);
  • Sidenote:* sprintf_s返回写入的字节数。在对printf()的调用中使用它的返回值,而不是像这样调用strlen()
const int size = sprintf_s (szBuffer1 + len, sizeof szBuffer1 - len, "%s", szBuffer2);
printf ("%d\n", len + n);

相关问题