Respuestas:
snprintf () no escribirá más que caracteres <size> (argumento 2d de snprintf) en su búfer, pero sí cuenta (y descarta) los caracteres adicionales que hubiera escrito, si hubiera habido espacio suficiente, y ese es el número que devuelve . ¡Sí, puede ser confuso!
Consulte esta referencia de snprintf () .
snprintf
hacer un búfer muy pequeño, anotar el número devuelto, luego malloc
un búfer del tamaño apropiado y volver a hacerlo. De esa manera, usted sabe cuántos bytes asignar.
snprintf
almacenar ningún búfer (un puntero de destino nulo se describe explícitamente como un argumento válido para el caso destlength == 0) al medir la longitud.
Un boceto de prueba para el Arduino Uno:
char buffer[10];
void setup() {
Serial.begin(9600);
int n = snprintf(buffer, 2, "hello");
Serial.println(n);
Serial.println(buffer);
}
void loop() {
}
Como escribió @JRobert, el "habría" es la clave. Hasta donde sé, solo snprintf y vsnprintf devuelven un número "would have".
Creo que la razón es poder saber si la cadena se truncó. Suponga que el parámetro 'tamaño' es 25 y que la cadena de formato es muy larga, entonces el valor de retorno se puede probar contra 25. Si el valor de retorno fue 26 (el "tendría" número de bytes), entonces la cadena se truncó.
No fue posible recuperar esta información cuando el número "habría" no estaba disponible.
Para completar, la página del manual para fprintf
estados:
La función snprintf () será equivalente a sprintf (), con la adición del argumento n que establece el tamaño del búfer al que se refiere s. Si n es cero, no se escribirá nada y s puede ser un puntero nulo. De lo contrario, los bytes de salida más allá del n-1 se descartarán en lugar de escribirse en la matriz, y se escribe un byte nulo al final de los bytes realmente escritos en la matriz.
y, más relevante:
Una vez completada con éxito, la función snprintf () devolverá el número de bytes en los que se escribirían si no hubiera sido lo suficientemente grande, excluyendo el byte nulo de terminación.
asdf
contiene "hola" o "h"? Si contiene "h", entonces el parámetro no ha sido ignorado.