Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

194
Views
¿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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!