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 的异常
请问这个情况怎么解释?
sprintf_s は、終端の NULL 文字をカウントせず、バッファに格納されているバイト数を返します。 swprintf_s は、終端の NULL ワイド文字をカウントせず、バッファに格納されているワイド文字の数を返します。
表示可能な文字は合計 9 つあり、末尾の '0' を含めるために 10 バイトを割り当てる必要があります。
3行目から5行目に注目してください
リーリーC++ には詳しくありませんが、公式ドキュメントを確認しました
リーリーパラメータの説明は次のとおりです。最初のパラメータのbuffer は出力の保存場所であり、2 番目のパラメータの sizeOfBuffer は最大許容文字数です。したがって、ここで変更する場合は、長さを確保する必要があります。 arrChar の値は 2 番目のパラメータの値と同じであり、4 番目のパラメータ nData の長さが sizeOfBuffer の長さ (8+1) を超えてはなりません。
この問題に関して、実際、私の当初の目的は、送信を容易にするために 8 バイトの値をバイト配列に格納することです。
したがって、実際にはメモリ コピーを使用するだけです。
ですが、次のような変換関数を使用します。 sprintf_s の場合、その機能は実際には値のリテラル値を文字列にコピーすることです。つまり、メモリ内の値の各桁の ASCII コードは値のバイナリ表現ではありません。
値を文字列にコピーします。文字列は可変長であり、数値の数が増えると増加します。