2009-09-09 7 views
6

이 기능을 사용하여 재미있는 문제가 있습니다. 나는 다음과 같이 사용 :sprintf_s problem

int nSeq = 1; 
char cBuf[8]; 
int j = sprintf_s(cBuf, sizeof(cBuf), "%08d", nSeq); 

그리고 때마다 나는 예외를 얻을. 예외는 buffer to small입니다. 함수의 두 번째 필드를 sizeof (cBuf) + 1로 변경했을 때

8 바이트 만 복사하고 8 바이트를 포함하는 배열을 추가해야하는 이유는 무엇입니까?

답변

10

버퍼에는 8 개의 장소가 있습니다. 귀하의 문자열은 8 문자 null 문자를 닫습니다 포함되어 있습니다.

+0

그래서 버퍼 크기를 1만큼 늘려야합니까? –

+1

예. 1은 정확히 널 종결 자의 크기입니다. 필자의 코드에서는 필자가이 여분의 문자를위한 장소가 필요하다는 사실을 강조하기 위해'char cBuf [8 + 1]'이라고 문자 그대로 쓴다. – xtofl

+1

'char [sizeof ("00000000")]'를 사용했습니다. – MSalters

1

모든 sprintf 함수는 문자열을 종료하는 데 null을 추가합니다. 따라서 실제로는 9 자입니다. 8 바이트의 텍스트 및 끝 0

+0

그래서 버퍼 크기를 1만큼 늘려야합니까? –

2

문자열에 % 08d로 인해 '\ 0'및 8 바이트의 데이터 (00000001)가 종료되어야합니다. 따라서 9로 크기를 조정해야합니다.