La ambigüedad comienza en el propio estándar C. Tanto C99 como C11 tienen una descripción de snprintf
función idéntica . Aquí está la descripción de C99:
7.19.6.5 La snprintf
función
Sinopsis
1 #include <stdio.h>
int snprintf(char * restrict s, size_t n, const char * restrict format, ...);
Descripción
2 La snprintf
función es equivalente a fprintf
, excepto que la salida se escribe en una matriz (especificada por argumento s
) en lugar de en una secuencia. Si n
es cero, no se escribe nada y s
puede ser un puntero nulo. De lo contrario, los caracteres de salida más allá de n-1
st se descartan en lugar de escribirse en la matriz, y se escribe un carácter nulo al final de los caracteres realmente escritos en la matriz. Si la copia tiene lugar entre objetos que se superponen, el comportamiento no está definido.
Devuelve
3 La snprintf
función devuelve el número de caracteres que se habrían escrito sin
ha sido suficientemente grande, sin contar el carácter nulo de terminación, o un valor negativo si se produjo un error de codificación. Por lo tanto, la salida terminada en nulo se ha escrito completamente si y solo si el valor devuelto es no negativo y menor que n
.
Por un lado la sentencia
De lo contrario, los caracteres de salida más allá de n-1
st se descartan en lugar de escribirse en la matriz, y se escribe un carácter nulo al final de los caracteres realmente escritos en la matriz.
dice que
si ( s
apunta a una matriz de 3 caracteres y) n
es 3, se escribirán 2 caracteres y se descartarán los caracteres más allá del segundo ; entonces el carácter nulo se escribe después de esos 2 (y el carácter nulo será el tercer carácter escrito) .
Y esto creo que responde a la pregunta original.
LA RESPUESTA:
Si la copia tiene lugar entre objetos que se superponen, el comportamiento es indefinido.
Si n
es 0, entonces no se escribe nada en la salida; de lo
contrario, si no se encuentran errores de codificación, la salida SIEMPRE termina en nulo ( independientemente de si la salida encaja en la matriz de salida o no ; si no, algunos caracteres se descartan de manera que la salida matriz nunca se desborda), de lo
contrario (si se encuentran errores de codificación) la salida puede permanecer sin terminación nula .
Por otro lado
La última frase
Por lo tanto, la salida terminada en nulo se ha escrito completamente si y solo si el valor devuelto es no negativo y menor que n
da ambigüedad (o mi inglés no es lo suficientemente bueno). Puedo interpretar esta oración de al menos dos formas:
1. La salida termina en nulo si y solo si el valor devuelto no es negativo y es menor quen
(lo que significa que si el valor devuelto no es menor que n
, es decir, la salida (incluida la terminando carácter nulo) no cabe en la matriz, entonces la salida no es terminada en nulo ).
2. La salida está completa (no se han descartado caracteres) si y solo si el valor devuelto es no negativo y menor quen
.
Creo que la interpretación 1 anterior contradice LA RESPUESTA, provoca malentendidos y largas discusiones. Es por eso que la última oración que describe la snprintf
función necesita un cambio para eliminar cualquier ambigüedad (lo que da motivos para escribir una propuesta para el estándar de lenguaje C).
El ejemplo de redacción no ambigua creo que se puede tomar de http://en.cppreference.com/w/c/io/fprintf (ver 4)
), gracias a @ "Martin Ba" por el enlace.
Consulte también la pregunta " snprintf: ¿Existen propuestas / planes de C estándar para cambiar la descripción de esta función? ".