sprintf_s 问题

Posted

技术标签:

【中文标题】sprintf_s 问题【英文标题】:sprintf_s problem 【发布时间】:2009-09-09 08:39:15 【问题描述】:

我在使用这个函数时遇到了一个有趣的问题。 我使用它如下:

int nSeq = 1;
char cBuf[8];
int j = sprintf_s(cBuf, sizeof(cBuf), "%08d", nSeq);

而且每次我遇到异常。例外是缓冲区很小。 当我将函数中的第二个字段更改为 sizeof(cBuf) + 1.

如果我只想复制 8 个字节并且我有一个包含 8 个字节的数组,为什么还要添加一个?

【问题讨论】:

【参考方案1】:

您的缓冲区包含 8 个位置。您的字符串包含 8 个字符一个空字符来关闭它。

【讨论】:

所以我需要将缓冲区的大小增加 1 ? 是的。 1 正好是空终止符的大小。在我的代码中,我什至直接写了char cBuf[8+1],以强调我需要为这个额外的字符放置位置。 我用过char[sizeof("00000000")]【参考方案2】:

由于 %08d,您的字符串将需要终止 '\0' 和 8 字节数据 (00000001)。 所以你必须将尺寸设为 9。

【讨论】:

【参考方案3】:

所有 sprintf 函数都添加一个 null 来终止字符串。所以实际上你的字符串是 9 个字符长。 8 个字节的文本和结尾的零

【讨论】:

所以我需要将缓冲区的大小增加 1 ?

以上是关于sprintf_s 问题的主要内容,如果未能解决你的问题,请参考以下文章

sprintf_s的使用

字符串函数sprintf / sprintf_s 容易出错的地方

字符串函数sprintf / sprintf_s 容易出错的地方

当我使用模板时,未在此范围GCC Linux环境中声明strerror_s,strcpy_s,localtime_s,sprintf_s?

如何将 CStringW 转换为 LPCWSTR? [复制]

sprintf()函数的用法