y, por supuesto, necesita que su búfer sea lo suficientemente grande.
+1 aunque me gusta un poco más la solución de Aeth, parece un poco más eficiente que volver a calcular la longitud de la cadena cada vez.
– extraneón
20 de abril de 2010 a las 10:47
Un truco que he visto en este sentido es #define eos(s) ((s)+strlen(s)), o declarar una función si lo prefiere. Entonces puedes usar sprintf(eos(Buffer), "Stuff")
– clstrfsck
20 de abril de 2010 a las 10:47
Aún más simple, puedes usar sprintf(strchr(s, '\0'), "...").
– Arto Bendiken
29 de marzo de 2014 a las 12:48
¿Para qué se agrega + strlen (Buffer) al Buffer real?
– bretcj7
17 de septiembre de 2016 a las 3:43
Esto es aritmética de punteros. Es como agregar la longitud actual de la cadena a la dirección de inicio del ‘Búfer’. Esta operación no es segura para mbs y cadenas Unicode. Como, por ejemplo, obtener la longitud de la cadena Unicode “Hola” devolvería 5, pero en realidad Búfer + 5 * tamaño de (wchar_t) se requiere en este caso
Aquí hay una versión con cierta resistencia a los errores. Es útil si no le importa cuándo ocurren los errores, siempre y cuando pueda continuar felizmente cuando ocurran.
El segundo argumento de snprintf no está firmado (tamaño_t), lo que significa que si longitud > MAX_BUF, entonces MAX_BUF-longitud se desbordará y snprintf felizmente escribirá fuera del búfer creando un desbordamiento de búfer. Tenga en cuenta que el retorno de snprintf es igual a la cantidad de bytes que se habrían escrito si hubiera habido suficiente espacio disponible y NO la cantidad de bytes realmente escritos.
Esto es justo lo que estaba buscando. A sugerencia de man fmemopen, encontré que open_memstream era un poco más adecuado para mi aplicación. Ver el Manual de GNU para un ejemplo.
– Liam
1 de febrero de 2017 a las 3:59
@Liam increíble, gracias por el consejo sobre open_memstream. Agregué un ejemplo para eso también.
– wkz
1 de febrero de 2017 a las 17:22
Fantástico, excepto que tampoco fmemopen ni open_memstream están disponibles en Windows.
– 7vujy0f0hy
7 oct 2017 a las 13:10
¿Ha sido útil esta solución?
Tu feedback nos ayuda a saber si la solución es correcta y está funcionando. De esta manera podemos revisar y corregir el contenido.
Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos.
Configurar y más información
No usaré sprintf sino snprintf, no usaré printf(str) sino printf(“%s”, str)
– pa.
20 de abril de 2010 a las 12:59