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 / sprintf_s 容易出错的地方
字符串函数sprintf / sprintf_s 容易出错的地方
当我使用模板时,未在此范围GCC Linux环境中声明strerror_s,strcpy_s,localtime_s,sprintf_s?