Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

195
Vistas
¿Mejores prácticas con sprintf?

Aquí está la situación:

Recibimos código de una fuente externa que usa sprintf como strcat. Me gusta esto:

 char buffer[1024]; sprintf(buffer, "Some text."); sprintf(buffer, "%s%s", buffer, "Some more text"); sprintf(buffer, "%s%s", buffer, "again more text");

Ahora, esto se ve raro. Todos estamos de acuerdo en que esto se ve raro. Eso no es lo que estoy preguntando. Todos sabemos que se debería haber usado strcat, y es más sencillo. Estoy preguntando sobre los posibles problemas, además de parecer raro, que esto podría causar. Estamos ejecutando en RHEL6 y usando gcc 4.9.3.

Gracias por tu ayuda.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

La función se declara como

 int sprintf(char * restrict s, const char * restrict format, ...);

preste atención al calificador de tipo restrict .

Según el Estándar C (7.21.6.6 La función sprintf)

2 La función sprintf es equivalente a fprintf, excepto que la salida se escribe en una matriz (especificada por el argumento s) en lugar de en una secuencia. Se escribe un carácter nulo al final de los caracteres escritos; no se cuenta como parte del valor devuelto. Si la copia tiene lugar entre objetos que se superponen, el comportamiento no está definido .

Entonces estas llamadas

 sprintf(buffer, "%s%s", buffer, "Some more text"); sprintf(buffer, "%s%s", buffer, "again more text");

invocar un comportamiento indefinido.

En cambio, las llamadas podrían escribirse como

 char buffer[1024]; int offset = 0; offset = sprintf( buffer + offset, "Some text."); offset += sprintf( buffer + offset, "%s", "Some more text"); sprintf( buffer + offset, "%s", "again more text");

O

 char buffer[1024]; char *p = buffer; p += sprintf( p, "Some text."); p += sprintf( p, "%s", "Some more text"); sprintf( p, "%s", "again more text");

En cuanto al calificador restrict entonces en términos generales en los medios (6.7.3 Calificadores de tipo)

8 Un objeto al que se accede a través de un puntero restringido tiene una asociación especial con ese puntero. Esta asociación, definida en 6.7.3.1 a continuación, requiere que todos los accesos a ese objeto usen, directa o indirectamente, el valor de ese puntero en particular.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda