Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: spicecobra en 25 Agosto 2013, 02:52 am



Título: Problema con C y Tokens
Publicado por: spicecobra en 25 Agosto 2013, 02:52 am
Hola, buenas!
Estoy con un enorme problema con C y los tokens.
Todo surge de este código:

Código:
#include <stdio.h>
#include <conio.h>
#include <string.h>
char *carga(int*,int);
void busqueda(char*,char*);
main()
{
  int i=0,j=0, n=0, opc; char *palabra, *texto;
  do {  printf("1- CARGA PALABRAS\n");
        printf("2- CARGA PROGRAMA\n");
        printf("3- BUSQUEDA\n");
        printf("4- SALIR\n");
        scanf(" %d", &opc);
        switch(opc) { case 1: { palabra=carga(&i,opc); break; };
                      case 2: { texto=carga(&j,opc); break; };
                      case 3: { busqueda(palabra, texto); break;};
                  }; } while(opc!=4);
  getche();
}
char *carga(int *x,int y)
{
   static char a[1000]; static char b[5000];
   if(y==1)
   { while((a[*x]=getchar())!=EOF)
     { ++(*x); };
   return a; 
   }
   else
   { while((b[*x]=getchar())!=EOF)
     { ++(*x);};
   return b;       
   };
}
void busqueda (char *z, char *w)

   char *token1;
   token1 = strtok(w," \n");
   while(token1!=NULL)
   { if ((strchr(z,(*token1))==NULL))
     printf("%s\n", token1);
     token1 = strtok (NULL, " \n");
   };
}       
     

La consigna es que ingrese una serie de palabras reservadas de un programa (opcion 1), que luego ingrese el programa (opcion 2); y que finalmente, cuando pulse la opcion 3: me muestre todas las palabras que no sean palabras reservadas.

Hasta las cargas, está todo bien. Surge el problema con los tokens. Cuando llamo a la función por primera vez me marca dos o tres palabras que no son reservadas (cuando hay más), y cuando la vuelvo a llamar, me devuelve unicamente la primera.

Algo está pasando con la función.

Por favor, necesito ayuda!

MUCHAS GRACIAS.


Título: Re: Problema con C y Tokens
Publicado por: eferion en 25 Agosto 2013, 18:11 pm
Creo que tu codigo rompe la mayoria de las normas de codificacion. No es legible y tiene poco sentido. Me explico:
Código
  1. char *carga(int *x,int y)
  2. {
  3.   static char a[1000]; static char b[5000];
  4.   if(y==1)
  5.   { while((a[*x]=getchar())!=EOF)
  6.     { ++(*x); };
  7.   return a;  
  8.   }
  9.   else
  10.   { while((b[*x]=getchar())!=EOF)
  11.     { ++(*x);};
  12.   return b;        
  13.   };
  14. }

No tiene sentido que unifiques las lecturas en una sola funcion si luego dicha funcion va a tener dos implementaciones diferentes. Ademas en vez de usar buffers estaticos dentro de la función deberias pasarlos como argumentos. Si eliminas los buffers estaticos vas a tener la misma implementacion para los dos casos.

Y otras tantas mas, pero estoy con una tablet y es mas complicado escribir... si te speras a septiembre te comento mas detalles si quieres.

Hablando de errores:

strtok modifica la cadena que se le pasa como argumento.

Para que todas las busquedas te devuelvan el mismo resultado tienes que copiar la lista de palabras en otro buffer y lanzar strtok pasando como argumento este segundo buffer.