sprintf y snprintf en C: ejercicio resuelto
sprintf y snprintf en C: ejercicio resuelto
Si buscas sprintf y snprintf en C ejercicio resuelto, aquí tienes los patrones más habituales: formatear números en cadenas, construir rutas de fichero dinámicamente y combinar campos en un único buffer, con la diferencia clave entre sprintf (sin límite) y snprintf (con límite seguro).
snprintf es la versión segura que nunca escribe más de n bytes incluyendo el terminador \0. En código moderno siempre se prefiere snprintf frente a sprintf.
Enunciado
- Usa
sprintfpara construir la cadena"Resultado: 42 (0x2A)". - Usa
snprintfpara construir rutas con el patrón"/logs/dia_03.log". - Detecta el truncamiento cuando el buffer es demasiado pequeño.
Solución en C
Resultado esperado
Errores frecuentes
- Usar
sprintfcon buffers de tamaño fijo: si el texto formateado supera el tamaño del buffer, se produce un desbordamiento de buffer (undefined behavior y vulnerabilidad de seguridad). - No comprobar el valor de retorno de
snprintf: devuelve el número de bytes que se habrían escrito sin el límite; si es>= n, hay truncamiento. - Confundir
snprintfconstrncpy:snprintfsiempre termina con\0;strncpyno lo garantiza si la cadena fuente es más larga quen. - Olvidar el
\0en el cálculo del tamaño:snprintf(buf, 10, ...)deja espacio para 9 caracteres más el terminador.
Aplicación práctica
snprintf es la función estándar para construir cadenas formateadas en C: nombres de fichero, mensajes de log, respuestas HTTP de texto plano y cualquier escenario donde se combinen datos numéricos y texto. Es la alternativa segura a la concatenación manual con strcat.
Siguiente ejercicio recomendado
- strcat y strncat en C: ejercicio resuelto
- strcpy y strncpy en C: ejercicio resuelto
- strlen, strchr, strstr en C: ejercicio resuelto
- Todos los ejercicios de C
Práctica guiada y libro completo
Si quieres una ruta completa con progresión real de dificultad:
FAQ
¿Qué devuelve snprintf exactamente?
Devuelve el número de bytes que se habrían escrito si el buffer fuera suficientemente grande, sin contar el \0 final. Si el valor devuelto es >= n (el tamaño del buffer), la cadena fue truncada y hay que aumentar el buffer o gestionar el truncamiento.
¿Por qué sprintf es considerado inseguro?
Porque no tiene límite de escritura. Si el texto formateado supera el tamaño del buffer, sprintf escribe más allá del límite, corrompiendo memoria adyacente. Esto es un desbordamiento de buffer, que en código de red o con entradas externas es una vulnerabilidad explotable.
¿Existe alguna alternativa más moderna?
En C11 existe sprintf_s y snprintf_s (extensiones opcionales del Anexo K), pero su adopción es limitada. La práctica estándar es usar snprintf con sizeof(buffer) siempre.