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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


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

Desconectado Desconectado

Mensajes: 5



Ver Perfil
[Ayuda] Problema con cadenas de caracteres
« en: 7 Mayo 2015, 11:05 am »

Buenas! Estoy realizando un programa que simula un NAT, en concreto estoy terminando la comprobacion del fichero de entrada, que sea correcto. En principio el codigo no tiene errores, compila y casi funciona como es debido, pero una cadena de caracteres almacenada en una tabla de caracteres me esta dando problemas. Paso el codigo y gracias de antemano!

Código:
int leeFichEnt(FILE *fich)
{
  struct IP orig;
  struct IP dest;
  struct IP auxorig;
  struct IP auxdest;
  int error=0;
  //Contadores, i para la cadena completa y c para cada dato que saque
  int i;
  int c;
  //Cadena entera
  char cad[256];
  //Procedencia del paquete
  char tipo[TIPO];
  //Datos de la IP origen
  char auxori[IPP];
  int puertori;
  int tamori;
  int tamportori;
  //Datos de la IP destino
  char auxdes[IPP];
  int puertdes;
  int tamdes;
  int tamportdes;
  //Tamaño de los datos del paquete
  char tamanio[2];
  int tam;
  //Cadena auxiliar
  char *aux=NULL;
  char *datos=NULL;
  
  while(fgets(cad, 256, fich)!=NULL)
    {  
      //Hay que obtener la procedencia del paquete
      for(i=0,c=0; i<=TIPO; c++,i++)
tipo[c]=cad[i];
      printf("%s\n", tipo);
      if(strcmp(tipo,PRIVADO) && strcmp(tipo, PUBLICO))
//Hay que guardar la cadena en errores
error=1;
      else
{
 //Obtenemos el tamanio de lo que hay entre [[ ]]
 for(c=0; c<=2; c++,i++)
   tamanio[c]=cad[i];
 tam=atoi(tamanio);
 aux=(char*) calloc(tam,sizeof (char));
 datos=(char*) calloc(tam-(2*MINIP+1), sizeof(char));
 if(aux==NULL)
   {
     printf(MENS_ERR6);
     error=2;
   }
 else
   {
     //Sacamos una cadena con datos e IPs
     for(c=0; c<=tam;c++,i++)
aux[c]=cad[i];
Aqui es donde viene el problema, espero que los comentarios os dejen claro cual es el problema que tengo
Código:
              //Desde aqui! sscanf hace algo raro con tipo
     printf("%s\n", tipo);
     //Guardamos segun el dato
     sscanf(aux, "%s %s %s", auxori, auxdes, datos);
     printf("%s\n", tipo);
     //Hasta aqui! La variable tipo cambia su contenido... Por que?
Si alguien puede decirme que pasa en ese sscanf seria de gran ayuda
Código:
	      sscanf(auxori, "%d.%d.%d.%d:%d", &auxorig.d1, &auxorig.d2, &auxorig.d3, &auxorig.d4, &puertori);
     sscanf(auxdes, "%d.%d.%d.%d:%d", &auxdest.d1, &auxdest.d2, &auxdest.d3, &auxdest.d4, &puertdes);

     //Calculamos tamanio del puerto origen
     if(puertori<10)
tamportori=1;
     else if(puertori>=10 && puertori<100)
tamportori=2;
     else if(puertori>=100 && puertori<1000)
tamportori=3;
     else
tamportori=4;
     //Calculamos tamanio del puerto destino
     if(puertdes<10)
tamportdes=1;
     else if(puertdes>=10 && puertdes<100)
tamportdes=2;
     else if(puertdes>=100 && puertdes<1000)
tamportdes=3;
     else
tamportdes=4;
     //Obtenemos tamanio de las cadenas IP
     tamori=strlen(auxori)-(tamportori+1);
     tamdes=strlen(auxdes)-(tamportdes+1);
     //Comprobamos que las IP son correctas
     error=compruebaIP(&orig, auxori, puertori, tamori);
     if(error==0)
error=compruebaIP(&dest, auxdes, puertdes, tamdes);
     printf("%s %d %s %s %s\n", tipo, tam, auxori, auxdes, datos);
   }
 free(aux);
 aux=NULL;
 free(datos);
 datos=NULL;
}
    }
  return error;
}


En línea

La vida es larga y dura, por eso chupame la vida.
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: [Ayuda] Problema con cadenas de caracteres
« Respuesta #1 en: 7 Mayo 2015, 13:13 pm »

¡Buenas!

Sin ver el código completo no se que es lo que estará pasando exactamente, pero bueno, ahí van posibles errores que pueden suceder:

Por lo que se vé en el último código que has dejado la variable aux es un puntero al que asignas memoria dinamicamente. No sé si al hacerlo has comprobado que el puntero devuelto no sea nulo. Si hubiese algún error en la asignación y te devuelve NULL, a la hora de intentar leer datos de la cadena estarías leyendo "basura" que se guardaría en las variables que pasas a sscanf. La lectura se podría estar haciendo incluso desde una "cadena" que no tuviese un '\0' al final, por lo que se podría estar sobrepasando los límites de las variables y posiblemente sobreescribiendo el valor de la variable tipo.

Algo parecido podría pasar si, aún habiendo podido asignar bien la memoria, al escribir el contenido en aux no pones un '\0' al final de esta, o si alguna de las palabras que contiene aux sobrepasa la longitud de las variables que pasas a sscanf.

Si mal no recuerdo, las variables en C ocupan posiciones consecutivas, por lo tanto si tienes dos cadenas, una de ellas de 3 caracteres y otra de 5 (por poner un ejemplo) te puedes encontrar con errores al sobrepasar los límites. Un ejemple si lees desde la entrada la palabra "Hola" y la guardas en la primera cadena, esta almacenara "Hol" y pasaría a la segunda, quedando esta con los caracteres que quedan por leer: {'a','\0'}. Y si por ejemplo la segunda cadena fuese un puntero los caracteres {'a','\0'} serían dos bytes seguidos que harían que el puntero apuntase a una dirección extraña (perdiendo, si lo hubiese, el contenido que tuvieses asignado dinamicamente).

Sin ver más código no puedo decirte cual es error exacto, pero puede ser alguna de las cosas mencionadas, suelen ser errores lógicos que no saltan a la hora de compilar pero que cuando ejecutas el programa dan resultados "locos" difíciles de detectar.

¡Saludos!

Se me ha olvidado mencionarlo pero es un despiste común (nos pasa a todos) olvidarnos de vez en cuando de dejar sitio para el carácter de fin de cadena, aunque sepas que el tamaño de los datos sea el correcto (porque los introduces tu y sabes que no vas a sobrepasar ningún límite o porque el formato sea fijo y sepas exactamente cuanto va a ocupar una cadena). Aunque supongo que ya lo habrás hecho, asegurate de que IPP tiene el valor correcto para almacenar todos los datos que quieras.

¡Saludos de nuevo!


« Última modificación: 7 Mayo 2015, 13:23 pm por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
jospar

Desconectado Desconectado

Mensajes: 5



Ver Perfil
Re: [Ayuda] Problema con cadenas de caracteres
« Respuesta #2 en: 7 Mayo 2015, 13:50 pm »

Citar
Si mal no recuerdo, las variables en C ocupan posiciones consecutivas, por lo tanto si tienes dos cadenas, una de ellas de 3 caracteres y otra de 5 (por poner un ejemplo) te puedes encontrar con errores al sobrepasar los límites. Un ejemple si lees desde la entrada la palabra "Hola" y la guardas en la primera cadena, esta almacenara "Hol" y pasaría a la segunda, quedando esta con los caracteres que quedan por leer: {'a','\0'}. Y si por ejemplo la segunda cadena fuese un puntero los caracteres {'a','\0'} serían dos bytes seguidos que harían que el puntero apuntase a una dirección extraña (perdiendo, si lo hubiese, el contenido que tuvieses asignado dinamicamente).

Aqui puede que este la respuesta a lo que busco, la verdad es que realmente ese es el codigo entero, a excepcion de un main sencillo (que hice para probar la funcion) y las constantes simbolicas (como IPP). Muchas gracias!!
En línea

La vida es larga y dura, por eso chupame la vida.
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: [Ayuda] Problema con cadenas de caracteres
« Respuesta #3 en: 11 Mayo 2015, 15:57 pm »

una cadena de caracteres almacenada en una tabla de caracteres me esta dando problemas.
En el primer fragmento el error se encuentra en el bucle donde obtienes la procedencia del paquete:
Código
  1. char tipo[TIPO];
  2.  
  3. /* ... */
  4.  
  5. for (i = 0, c = 0; i <= TIPO; c++,i++)
  6.   tipo[c] = cad[i];
Ello porque el array "tipo" consiste de "TIPO" elementos y a ellos accedes mediante los indices 0 .. TIPO-1, si deseas almacenar ahí una cadena debes reservar el ultimo carácter para el '\0' con lo que los indices validos se reducen a 0 .. TIPO-2 pero en el bucle se copian los caracteres con indices 0 .. TIPO (un carácter de mas y no se agrega el '\0').

Para solucionarlo hay varias opciones, una es cambiar el bucle a:
Código
  1. for (i = 0; i < TIPO - 1; i++)
  2.   tipo[i] = cad[i];
  3. tipo[i] = '\0';
Otra es sustituir el bucle por una llamada a sprintf:
Código
  1. sprintf(tipo, "%.*s", TIPO - 1, cad);

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

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[ANSI C]Ayuda con cadenas de caracteres.
Programación C/C++
volteo0101 4 5,034 Último mensaje 27 Febrero 2011, 11:38 am
por volteo0101
Ayuda con cadenas de caracteres.
Programación C/C++
GilbertoBrewer 8 3,998 Último mensaje 28 Noviembre 2014, 17:33 pm
por GilbertoBrewer
Problema con ASCII, Strings y cadenas de caracteres.
Programación C/C++
pikoc 0 1,568 Último mensaje 7 Mayo 2015, 12:54 pm
por pikoc
[C] Problema con caracteres y cadenas « 1 2 »
Programación C/C++
n-utz 11 5,497 Último mensaje 23 Mayo 2016, 00:53 am
por n-utz
Problema al comparar cadenas de caracteres [C]
Programación C/C++
S4ms3pi0l__ 3 3,307 Último mensaje 27 Noviembre 2017, 20:00 pm
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines