2009-09-09 11 views
6

Tengo un problema raro al usar esta función. lo uso como sigue:sprintf_s problema

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

Y cada vez que recibo una excepción. La excepción es buffer to small. Cuando cambié el segundo campo en la función a sizeof (cBuf) + 1.

¿Por qué tengo que agregar uno si solo quiero copiar 8 bytes y tengo una matriz que contiene 8 bytes?

Respuesta

10

Su memoria intermedia contiene 8 lugares. Su cadena contiene 8 caracteres y un carácter nulo para cerrarlo.

+0

¿Debo aumentar el tamaño del buffer en 1? –

+1

Sí. 1 es exactamente el tamaño del terminador nulo. En mi código, incluso literalmente escribo 'char cBuf [8 + 1]' para enfatizar el hecho de que necesito lugar para este personaje extra. – xtofl

+1

He usado 'char [sizeof (" 00000000 ")]'. – MSalters

1

Todas las funciones sprintf agregan un nulo para terminar una cadena. Entonces, en efecto, tu cadena tiene 9 caracteres de largo. 8 bytes de texto y el cero final

+0

¿Debo aumentar el tamaño del buffer en 1? –

2

Su cadena requerirá la terminación de '\ 0' y 8 bytes de datos (00000001) debido a% 08d. Así que tiene que medir como 9.