elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con sprintf()
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con sprintf()  (Leído 2,266 veces)
soyloqbuskas

Desconectado Desconectado

Mensajes: 219


¡El conocimiento es de todos!


Ver Perfil
Problema con sprintf()
« en: 11 Octubre 2012, 15:24 pm »

¡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:
Código
  1. char * httpPacket(char *httpDatos){
  2.  
  3.        char packet[65536]={""};
  4.        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);
  5.        printf("paquete: %s\n",packet);
  6.        return (char *) packet;
  7.  
  8. }

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?


En línea

"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


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Problema con sprintf()
« Respuesta #1 en: 11 Octubre 2012, 16:54 pm »

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:
Código
  1. 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:
Código
  1. char *httpPacket(char *httpDatos)
  2. {
  3.   char *packet = malloc(65536);
  4.  
  5.   /* ... */

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


En línea

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

Desconectado Desconectado

Mensajes: 219


¡El conocimiento es de todos!


Ver Perfil
Re: Problema con sprintf()
« Respuesta #2 en: 12 Octubre 2012, 02:47 am »

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

Un saludo.
En línea

"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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema BlueZScanner y problema de conexión
Hacking Mobile
Kasswed 3 6,648 Último mensaje 6 Mayo 2006, 22:04 pm
por Gospel
[AYUDA] Warning: sprintf() [function.sprintf]: Too few arguments
PHP
Rudy21 3 5,647 Último mensaje 30 Julio 2008, 15:51 pm
por Ertai
problema con sprintf()
Programación C/C++
m@o_614 1 1,730 Último mensaje 25 Septiembre 2013, 19:30 pm
por rir3760
Arreglos,punteros y sprintf.-
Programación C/C++
DanielPy 4 2,839 Último mensaje 13 Diciembre 2013, 17:50 pm
por DanielPy
problema con sprintf
Programación C/C++
m@o_614 3 2,216 Último mensaje 11 Febrero 2014, 03:01 am
por Yoel Alejandro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines