2009-09-09 11 views
6

Mam zabawny problem przy użyciu tej funkcji. Używam go następująco:sprintf_s problem

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

I za każdym razem otrzymuję wyjątek. Wyjątkiem jest mały bufor. Po zmianie drugiego pola w funkcji na sizeof (cBuf) + 1.

Dlaczego muszę dodać, jeśli chcę skopiować tylko 8 bajtów i mam tablicę zawierającą 8 bajtów?

Odpowiedz

10

Twój bufor zawiera 8 miejsc. Twój ciąg znaków zawiera 8 znaków i znak null, aby go zamknąć.

+0

Więc muszę zwiększyć rozmiar bufora o 1? –

+1

Tak. 1 ma dokładnie rozmiar terminatora zerowego. W moim kodzie dosłownie piszę 'char cBuf [8 + 1]', aby podkreślić fakt, że potrzebuję miejsca dla tej dodatkowej postaci. – xtofl

+1

Użyłem 'char [sizeof (" 00000000 ")]'. – MSalters

1

Wszystkie funkcje sprintf dodają wartość null, aby zakończyć łańcuch. W efekcie twój ciąg ma 9 znaków. 8 bajtów tekstu i końcowego zera

+0

Więc muszę zwiększyć rozmiar bufora o 1? –

2

Twój ciąg będzie wymagał zakończenia "\ 0" i 8 bajtów danych (00000001) z powodu% 08d. Więc musisz rozmiarem jako 9.