c++ - sprintf_s第二个参数的设置问题?
巴扎黑
巴扎黑 2017-04-17 15:16:43
0
3
662
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 的异常
请问这个情况怎么解释?

巴扎黑
巴扎黑

membalas semua(3)
Peter_Zhu

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';

Peter_Zhu

注意一下第三行到第五行

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。

PHPzhong

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

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!