Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

192
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda