问题描述
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码,而不是该数值的二进制表示。
将数值拷贝到字符串中,该字符串是不定长的,会随之数字个数的增加而增加。