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

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  fallo de segmento por (manipulacion de ) char*
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: fallo de segmento por (manipulacion de ) char*  (Leído 2,910 veces)
eduardosufan

Desconectado Desconectado

Mensajes: 3


Ver Perfil
fallo de segmento por (manipulacion de ) char*
« en: 10 Junio 2013, 02:16 am »

hola a todos, estoy haciendo una funcion en c que recibe un nombre de un archivo del tipo "nombre archivo. numero de red", por ejemplo:
matriz.0
Esto que indica que matriz tiene asociado un codigo, por ejemplo el numero 1, y el 0 es el numero de red. Es decir que debo generar un codigo numerico con ese 1 y 0 y devolverlos en un int.
La funcion, esta bien codificada y funciona si la utilizo por separado en otro programa en c, pero luego de añadirlo al programa principal he notado que la manipulacion de cadenas char* genera el fallo. Debido a que si comento las 3 lineas en la funcion:

nombrearchivo = strtok( cadena, "." );       
red = strtok( NULL, "." );                   
codigored=atoi(red);               

El segmentation fault desaparece. He probado asignar memoria e inicializar todas las variables pero el error persiste, alguien puede ayudarme asi encuentro el error? muchas gracias.

El siguiente es el codigo de la funcion en c:


 int generasubPalabra(char* nombre) // recibe el nombre del archivo y devuelve el codigo de archivo, para ser incluido en la palabra
{
   char *nombrearchivo=NULL;        //nombre de archivo a ser cargado
   int codigoarchivo=0;             //codigo del archivo
   
   char *red=NULL;                  //char con la red, a ser casteado
   int codigored=0;                  //entero final con el codigo de red
   
   int subpalabra=1;                //palabra retornada de 12 bits (3 datos hexa)
   
   //allocar memoria a los char*
   nombrearchivo = (char*) malloc (sizeof(char)*50); //se alloca para 50 caracteres, es decir que el nombre del
                                        //archivo no puede superar ese numero
   
   red = (char*) malloc (sizeof(char)*4);
   
   char cadena[strlen(nombre)+1];    
   strcpy(cadena, nombre);          //se copia el nombre en cadena para ser manipulada sin modificar la ruta
   
   //ACA ESTA EL ERROR: alguna de las 3 funciones, o las 3, genera una violacion de segmento
   //romper cadena en nombre - nro de red
   //Primera llamada => Primer token (primer elemento hasta el punto, es el nombre del archivo)
   nombrearchivo = strtok( cadena, "." );       
   printf( "nombre del archivo %s\n", nombrearchivo );
   
   //Segunda llamada => Segundo token (segundo elemento, desde el punto, es el nro de red)
   red = strtok( NULL, "." );                   
   printf( "numero de red %s\n", red );
   
   codigored=atoi(red);                 //obtengo el entero correspodiente a la red (cast)
   printf( "codigo de red %d\n", codigored );
 
   //con la siguiente secuencia se traduce el string contenido en nombrearchivo, al codigo correspondiente para la palabra
   //no se puede hacer con case en c   
   
   if (strcmp(nombrearchivo,"matriz_incidencia")==0) {
      codigoarchivo=1;
   }
   else if (strcmp(nombrearchivo,"matriz_brazos_inhibidores")==0) {
       codigoarchivo=2;
   }
   else if (strcmp(nombrearchivo,"matriz_prioridades_red")==0) {
       codigoarchivo=3;
   }
   else if (strcmp(nombrearchivo,"matriz_relacion_disparos_distribuidos")==0) {
       codigoarchivo=4;
   }
   else if (strcmp(nombrearchivo,"matriz_prioridades_disparos_distribuidos")==0) {
       codigoarchivo=5;
   }
   else if (strcmp(nombrearchivo,"vector_marcado_inicial")==0) {
       codigoarchivo=6;
   }
   else if (strcmp(nombrearchivo,"vector_cotas_plazas")==0) {
       codigoarchivo=7;
   }
   else if (strcmp(nombrearchivo,"vector_transiciones_automaticas")==0) {
       codigoarchivo=8;
   }
   else if (strcmp(nombrearchivo,"vector_transiciones_noinformadas")==0) {
       codigoarchivo=9;
   }
   else if (strcmp(nombrearchivo,"vector_mascara_interrupciones")==0) {
       codigoarchivo=10;
   }
   else if (strcmp(nombrearchivo,"vector_cola_entrada")==0) {
       codigoarchivo=11;
   }
   else if (strcmp(nombrearchivo,"vector_consulta_disparo_especifico")==0) {
       codigoarchivo=12;
   }
   else if (strcmp(nombrearchivo,"vector_consulta_plaza")==0) {
       codigoarchivo=13;
   }
   else {
       codigoarchivo=31;  //se retorna el ultimo valor posible (5bits =11111)
       printf("No existe el archivo, verifique ubicacion y permisos \n");
   }
   
   printf( "codigo de archivo %d\n", codigoarchivo );   
               
   //se concatena en los 5 bits mas significativos la red, y en los siguientes 5 bits mas significativos el codigo de archivo
   subpalabra = 0x000;                  
   subpalabra+= 0x080*codigored;          //red
   subpalabra+= 0x004*codigoarchivo;        //codigo de archivo
   
   printf("la subpalabra generada es: %x\n", subpalabra);
   return subpalabra;
   
}


En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: fallo de segmento por (manipulacion de ) char*
« Respuesta #1 en: 10 Junio 2013, 06:14 am »

Prueba con este formato:

Salida:


Código
  1. matriz   0
  2. Process returned 0 (0x0)   execution time
  3. Press any key to continue.
  4.  

Código:


Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main ()
  5. {
  6.    char nombrearchivo[50],*pch;
  7.    int red=0;
  8.    char cadena[] ="matriz.0";
  9.    pch = strtok (cadena,".");
  10.    while (pch != NULL )
  11.    {
  12.        printf ("%s   ",pch);
  13.        pch = strtok (NULL, ".");
  14.    }
  15.    return 0;
  16. }
  17.  

Saluditos! .... ..


« Última modificación: 10 Junio 2013, 06:22 am por leosansan » En línea

eduardosufan

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: fallo de segmento por (manipulacion de ) char*
« Respuesta #2 en: 10 Junio 2013, 16:20 pm »

hola, he añadido tu codigo pero da segmentation fault apenas ingresa a la funcion.

Necesito obtener por separado, el nombre del archivo para obtener el codigo y el numero que sigue al punto, para obtener el codigo de red
tu respuesta no separa, sino que usa la variable pch para ello.

no puedo utilizar la siguiente linea:
  char cadena[] ="matriz.0";

debido a que el nombre del archivo viene como parametro a la funcion, como char *nombre. lo que hice es lo siguiente:

 char *pch;
    strcpy(cadena, nombre);
    pch = strtok (cadena,"."); // luego de esta sentencia deberia poner los if else anidados y obtener el   //codigo de red
    while (pch != NULL )
    {
        printf ("%s   ",pch);
        pch = strtok (NULL, ".");
        codigored=atoi(pch);
    }
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: fallo de segmento por (manipulacion de ) char*
« Respuesta #3 en: 10 Junio 2013, 17:09 pm »

Creo haberte entendido mejor  esta vez. Buscas una salida como:

Código
  1. nombre=matriz   red=0
  2. Process returned 0 (0x0)
  3. Press any key to continue.
  4.  

Donde se pasa a una función matriz.0 y la función debe separarla en dos. ¿O.K?.

Si es como digo el código que me hace lo anterior es:


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. void desglosar (char *nombrearchivo)
  5. {
  6.    int i=0,red=0;
  7.    char *nombre,*red_ch;
  8.    nombre = strtok (nombrearchivo,".");
  9.    printf ("nombre=%s   ",nombre);
  10.    red_ch = strtok (NULL, ".");
  11.    red = atoi (red_ch);
  12.    printf ("red=%d",red);
  13. }
  14. int main ()
  15. {
  16.    char cadena[] ="matriz.0";
  17.    desglosar ( cadena);
  18.    return 0;
  19. }
  20.  

Espero te sirva de algo esta vez y si no machaca nos con tus dudas. ;)

Saluditos! .... ..
« Última modificación: 10 Junio 2013, 19:14 pm por leosansan » En línea

eduardosufan

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: fallo de segmento por (manipulacion de ) char*
« Respuesta #4 en: 11 Junio 2013, 19:23 pm »

porque para tomar el siguiente token se hace strtok (NULL, "."); ??
es decir, el siguiente token (y ultimo) es el numero de red

por otro lado, como hago para ver si el nombre del archivo que viene a la funcion, contiene el /0 al final?
me dijeron que ese puede ser un problema
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: fallo de segmento por (manipulacion de ) char*
« Respuesta #5 en: 12 Junio 2013, 07:27 am »

porque para tomar el siguiente token se hace strtok (NULL, "."); ??
es decir, el siguiente token (y ultimo) es el numero de red

Porque la siguiente cadena estará entre el "." y el final de la cadena, alias NULL.


por otro lado, como hago para ver si el nombre del archivo que viene a la funcion, contiene el /0 al final?
me dijeron que ese puede ser un problema

¡Manda tela la preguntita!.

Una forma de asegurarse el nulo al final es inicializando la cadena a cero, es decir: *cadena ={0}, o bien cadena[256]={0}.

Saluditos! ....
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines