Problema con C y Tokens

Iniciado por spicecobra, 25 Agosto 2013, 02:52 AM

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

spicecobra

Hola, buenas!
Estoy con un enorme problema con C y los tokens.
Todo surge de este 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.

eferion

Creo que tu codigo rompe la mayoria de las normas de codificacion. No es legible y tiene poco sentido. Me explico:
Cita de: spicecobra en 25 Agosto 2013, 02:52 AM

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;       
   };
}

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.