Problema con sprintf()

Iniciado por soyloqbuskas, 11 Octubre 2012, 15:24 PM

0 Miembros y 1 Visitante están viendo este tema.

soyloqbuskas

¡Buenas a todos!

Tengo un problemilla con sprintf(). El problema esta en que me duplica la cadena y no coge bien las variables....

Esta es la funcion:
char * httpPacket(char *httpDatos){

        char packet[65536]={""};
        sprintf(packet,"HTTP/1.1 200 OK\r\nDate: Thu, 22 Mar 2012 02:02:42 GMT\r\nContent-Type: text/html; charset-UTF-8\r\nContent-Encoding: gzip\r\nContent-Lengh: %d\r\nServer: gws\r\n\r\n%s",sizeof(httpDatos), httpDatos);
        printf("paquete: %s\n",packet);
        return (char *) packet;

}


La variable httpDatos contiene codigo html...

Y el printf(packet) tiene como salida esto:

Citar
paquete: HTTP/1.1 200 OK
Date: Thu, 22 Mar 2012 02:02:42 GMT
Content-Type: text/html; charset-UTF-8
Content-Encoding: gzip
Content-Lengh: 4
Server: gws

HTTP/1.1 200 OK
Date: Thu, 22 Mar 2012 02:02:42 GMT
Content-Type: text/html; charset-UTF-8
Content-Encoding: gzip
Content-Lengh: 4
Server: gws



Cuando en realidad deberia ser asi:

Citar
paquete: HTTP/1.1 200 OK
Date: Thu, 22 Mar 2012 02:02:42 GMT
Content-Type: text/html; charset-UTF-8
Content-Encoding: gzip
Content-Lengh: 34
Server: gws

<html>
     <h1>Prueba</h1>
</html>

Si os fijais, duplica la cabecera, pone mal el campo Content-Length y no muestra el codigo html...

¿Donde esta el fallo?
"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw

rir3760

Revisando la función hay tres errores.

El primero es utilizar '{""}' para inicializar el array. En su lugar se debe utilizar "" o bien {'\0'}. Por ejemplo:
char packet[65536] = ""; /* "" o {'\0'}; */

El segundo es utilizar la dirección en memoria de una variable local (el array "packet") como valor de retorno de la función. Las variables locales se destruyen (la memoria utilizada por ellas se libera) justo al terminar la función. Para solucionarlo debes calificar con "static" al array o bien reservar memoria mediante la función "malloc". Un ejemplo de esto ultimo:
char *httpPacket(char *httpDatos)
{
   char *packet = malloc(65536);
   
   /* ... */


El ultimo es lógico: esperas que "sizeof(httpDatos)" resulte en el numero de caracteres de la cadena pasada como argumento. No es así, utilizar dentro de la función "sizeof(httpDatos)" es lo mismo que "sizeof(char *)" y por eso resulta en cuatro (ese es el tamaño del puntero en tu SO). La solución aquí es agregar otro parámetro y pasar "manualmente" el numero de caracteres o bien llamar a la función "strlen" para que ella haga el trabajo.

Por ultimo el error que mencionas sobre la cadena duplicada es difícil de explicar (me refiero a encontrarle una causa), te recomendaría que antes de llamar a la función verifiques el contenido de la cadena empezando por revisar que incluya el carácter terminador '\0'.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

soyloqbuskas

Muchas gracias por las aclaraciones, enseguida me pondre a corregir.

Un saludo.
"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw