Pregunta

Estoy usando swprintf para construir una cadena en un buffer (usando un bucle entre otras cosas).

const int MaxStringLengthPerCharacter = 10 + 1;
wchar_t* pTmp = pBuffer;
for ( size_t i = 0; i < nNumPlayers ; ++i)
{
    const int nPlayerId = GetPlayer(i);
    const int nWritten = swprintf(pTmp, MaxStringLengthPerCharacter, TEXT("%d,"), nPlayerId);
    assert(nWritten >= 0 );
    pTmp += nWritten;
}

*pTaskPlayers = '\0';

Si durante la prueba la aserción no golpea, puedo estar seguro de que nunca llegará en el código en vivo? Es decir, ¿necesito para comprobar si nWritten <0 y mango que, con seguridad o puedo suponer que no habrá un problema?

¿En qué circunstancias puede devolver -1? La documentación más o menos justo afirma "Si la función falla". En un lugar que he leído que se producirá un error si no puede coincidir con los argumentos (es decir, el formato de cadenas a la varargs) pero eso no me preocupa.

También estoy preocupado de desbordamiento del búfer en este caso -. Sé que el tampón es lo suficientemente grande

¿Fue útil?

Solución

A partir de la norma C99:

La función sprintf devuelve el número de caracteres escritos en la matriz, sin contar el carácter de terminación null, o un valor negativo si se produjo un error de codificación.

Esto ocurre generalmente sólo con las funciones multi-byte y el conjunto de caracteres de caracteres anchos.

Otros consejos

Se puede fallar con cadena de formato incorrecto, por ejemplo, que no puede pasar en su caso.

Si el buffer no es lo suficientemente grande, puede.

De lo contrario, no hay razón para que falle.

En UNIX, puede fallar:

 EILSEQ
       A wide-character code that does not  correspond  to  a
       valid character has been detected.

 EINVAL
       There are insufficient arguments.

EILSEQ ya se ha mencionado.

También puede fallar, SIGSEGV, cuando el especificador de formato no coincide con los datos - ejemplo usando un% s especificador de formato con un int, el ejemplo 32 bits:

int pdq=0xffffffff;
char tmp[32]={0x0};

sprintf(tmp, "%s", pdq);

Creo que hay otro caso en el que snprintf () no puede tener éxito. No parece ser mencionado en POSIX o la corriente de página de manual de Linux.

Al completar con éxito, la función snprintf () devolverá el número de bytes que se escribirían a s tenido n sido suficientemente grande excluyendo el byte de terminación nula.

snprintf () devuelve int. Pero una cadena de entrada podría ser mayor que INT_MAX.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top