c++ - sprintf_s第二个参数的设置问题?

【字号: 日期:2023-04-01浏览:38作者:雯心

问题描述

int _tmain(int argc, _TCHAR* argv[]){ long long nData = 143336600; char arrChar[8+2]; int nRet = sprintf_s(arrChar,8+2,'%lld',nData); char* pData; pData = arrChar; return 0;}

上面这段代码能够在VS2010中正常运行,其中nRet == 9;但是,当8+2改成8+1的时候,就会报buffer too small 的异常请问这个情况怎么解释?

问题解答

回答1:

sprintf_s returns the number of bytes stored in buffer, not counting the terminating null character. swprintf_s returns the number of wide characters stored in buffer, not counting the terminating null wide character.

一共九个可见字符,需要分配10个字节长度,用来包含结尾的’0’;

回答2:

注意一下第三行到第五行

char arrChar[8+2];int nRet = sprintf_s(arrChar,8+2,'%lld',nData);

不熟悉C++,但是查了一下官方文档

int sprintf_s( char *buffer, size_t sizeOfBuffer, const char *format [, argument] ... );

参数说明是这样的,第一个参数buffer是输出存储位置,第二个参数sizeOfBuffer是最大允许的字符数,因此,这里要改的话需要确保arrChar的长度和第二个参数的值一样,同时还要确保第四个参数nData的长度不能大于sizeOfBuffer的长度,也就是8+1。

回答3:

关于这个问题,其实我的本意,只是想把8字节表示的数值,用字节数组存储,方便传输;所以其实只用内存拷贝就可以了,可是我用了sprintf_s这样的转换函数,它的作用其实是将该数值的字面值拷贝到一个字符串中,也就是说在内存中是该数值每个数字的ASCII码,而不是该数值的二进制表示。

将数值拷贝到字符串中,该字符串是不定长的,会随之数字个数的增加而增加。

相关文章: