Heim > Fragen und Antworten > Hauptteil
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 的异常
请问这个情况怎么解释?
天蓬老师2017-04-17 15:18:43
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';
天蓬老师2017-04-17 15:18:43
注意一下第三行到第五行
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。
PHPz2017-04-17 15:18:43
关于这个问题,其实我的本意,只是想把8字节表示的数值,用字节数组存储,方便传输;
所以其实只用内存拷贝就可以了,
可是我用了sprintf_s这样的转换函数,它的作用其实是将该数值的字面值拷贝到一个字符串中,也就是说在内存中是该数值每个数字的ASCII码,而不是该数值的二进制表示。
将数值拷贝到字符串中,该字符串是不定长的,会随之数字个数的增加而增加。