ホームページ  >  に質問  >  本文

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

巴扎黑巴扎黑2765日前664

全員に返信(3)返信します

  • 天蓬老师

    天蓬老师2017-04-17 15:18:43

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

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

    返事
    0
  • 天蓬老师

    天蓬老师2017-04-17 15:18:43

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

    リーリー

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

    リーリー

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

    返事
    0
  • PHPz

    PHPz2017-04-17 15:18:43

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

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

    返事
    0
  • キャンセル返事