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

巴扎黑
巴扎黑

全員に返信(3)
Peter_Zhu

sprintf_s は、終端の NULL 文字をカウントせず、バッファに格納されているバイト数を返します。 swprintf_s は、終端の NULL ワイド文字をカウントせず、バッファに格納されているワイド文字の数を返します。

表示可能な文字は合計 9 つあり、末尾の '0' を含めるために 10 バイトを割り当てる必要があります。

いいねを押す +0
Peter_Zhu

3行目から5行目に注目してください

リーリー

C++ には詳しくありませんが、公式ドキュメントを確認しました

リーリー

パラメータの説明は次のとおりです。最初のパラメータのbuffer は出力の保存場所であり、2 番目のパラメータの sizeOfBuffer は最大許容文字数です。したがって、ここで変更する場合は、長さを確保する必要があります。 arrChar の値は 2 番目のパラメータの値と同じであり、4 番目のパラメータ nData の長さが sizeOfBuffer の長さ (8+1) を超えてはなりません。

いいねを押す +0
PHPzhong

この問題に関して、実際、私の当初の目的は、送信を容易にするために 8 バイトの値をバイト配列に格納することです。
したがって、実際にはメモリ コピーを使用するだけです。
ですが、次のような変換関数を使用します。 sprintf_s の場合、その機能は実際には値のリテラル値を文字列にコピーすることです。つまり、メモリ内の値の各桁の ASCII コードは値のバイナリ表現ではありません。

値を文字列にコピーします。文字列は可変長であり、数値の数が増えると増加します。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!