찾다

 >  Q&A  >  본문

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

巴扎黑巴扎黑2807일 전681

모든 응답(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 에 익숙하지 않지만 공식 문서를 확인했습니다

    으아악

    매개변수 설명은 다음과 같습니다. 첫 번째 매개변수 버퍼는 출력 저장 위치이고, 두 번째 매개변수 sizeOfBuffer는 허용되는 최대 문자 수이므로 여기서 변경하려면 길이를 확인해야 합니다. arrChar의 값은 두 번째 매개변수의 값과 동일하며, 네 번째 매개변수 nData의 길이가 sizeOfBuffer의 길이인 8 1보다 클 수 없도록 합니다.

    회신하다
    0
  • PHPz

    PHPz2017-04-17 15:18:43

    이 문제와 관련하여 사실 제 원래 의도는 쉽게 전송하기 위해 8바이트 값을 바이트 배열에 저장하는 것입니다.
    그래서 실제로는 메모리 복사를 사용하지만
    다음과 같은 변환 기능을 사용합니다. sprintf_s의 기능은 실제로 값의 리터럴 값을 문자열로 복사하는 것입니다. 즉, 메모리에 있는 값의 각 숫자에 대한 ASCII 코드는 값의 이진 표현이 아닙니다.

    값을 문자열로 복사합니다. 문자열은 가변 길이이며 숫자가 늘어날수록 늘어납니다.

    회신하다
    0
  • 취소회신하다