Rumah  >  Soal Jawab  >  teks badan

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

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 的异常
请问这个情况怎么解释?

巴扎黑巴扎黑2715 hari yang lalu641

membalas semua(3)saya akan balas

  • 天蓬老师

    天蓬老师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';

    balas
    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。

    balas
    0
  • PHPz

    PHPz2017-04-17 15:18:43

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

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

    balas
    0
  • Batalbalas