tokenizar cadena

Si eres principiante y tienes alguna consulta entra en este foro.
Responder
Mensaje
Autor
Indaganster
Mensajes: 8
Registrado: 15/05/2009 1:21 pm
Ubicación: Mexico

tokenizar cadena

#1 Mensaje por Indaganster » 19/11/2016 3:55 pm

Buen dia a todos los del foro.
Solicito su ayuda ya que en estos momentos estoy en mis primeros pasos por el lenguaje c, y me he topado con un problema que
ya me tiene desesperado.
El caso es que estoy desarrollando la siguiente funcion que sirve para extraer tokens de una cadena de texto he aqui el codigo que hasta ahora he hecho

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX 100
bool tokenizer(char *s,char sep,char *token,int *aux);
int main()
{
    char str[MAX]={"Juan|Pedro|Pablo|Carlos"},
            token[MAX];
    int aux=0;

    while( tokenizer(str,'|',token,&aux) )/*extrae e imprime los tokens de la cadena uno por uno*/
    {
        printf(" %s\n",token);
    }
    return 0;
}

//s = cadena original
// sep=caracter que marca el token
// token = cadena destino que guardara el token extraido
//  aux = numero de posicion del token a extraer (0,1,2.....)
bool tokenizer(char *s,char sep,char  *token,int *aux)
{
    int i=0,j=0;
    bool flag = false;
    int t=0;
    while(s[i]!='\0')
    {
        if(s[i]!=sep)
         {
             token[j]=s[i];
            j++;
         }

         if(s[i]==sep)
         {
             if(t==*aux)
                {flag=true;
                  token[j]='\0';
                  break;
                 }
              else
              {
                  t++;
                  j=0;
              }
         }
          i++;

    }
    *aux++;
    return flag;

}
lo que he logrado con esto es que la funcion extraiga el primer token y el ciclo while del main entre en infinito imprimiendolo cada vez. Espero que alguien pueda ayudarme ya que no se me ha ocurrido como corregir esto.
Me despido felicitándolos por este gran esfuerzo colectivo y agradeciendo de antemano la ayuda que puedan brindarme.

Avatar de Usuario
daltomi
Mensajes: 354
Registrado: 28/04/2007 7:29 pm
Ubicación: Argentina

Re: tokenizar cadena

#2 Mensaje por daltomi » 20/11/2016 7:23 pm

Buenas.

Tienes un problema con la precedencia de operadores en *aux++; el compilador lo interpreta como: *(aux++).
Es decir, el operador de post-incremento (A++) precede/(tiene prioridad) al operador de indirección (*A).

Tienes 2 soluciones:
Usar paréntesis (recomendado ante cualquier duda):

Código: Seleccionar todo

(*aux)++;
Usar el operador de pre-incremento (++A) el cual tiene la misma prioridad que el operador de indirección pero la asociatividad es de derecha a izquierda.

Código: Seleccionar todo

++*aux;
.
El compilador lo interpreta como: ++(*aux).

Saludos.

Indaganster
Mensajes: 8
Registrado: 15/05/2009 1:21 pm
Ubicación: Mexico

Re: tokenizar cadena

#3 Mensaje por Indaganster » 21/11/2016 4:19 pm

Muchas gracias por la pronta ayuda bro :) tenias razón. Pero ahora surgió otro problema, el programa solo me extra los 3 primeros nombres y omite el ultimo (en este caso "Carlos"), sabes como podría corregir esto. Gracias.

Avatar de Usuario
daltomi
Mensajes: 354
Registrado: 28/04/2007 7:29 pm
Ubicación: Argentina

Re: tokenizar cadena

#4 Mensaje por daltomi » 22/11/2016 1:51 am

¿Haz probado agregándole el token?:

Código: Seleccionar todo

Carlos|

Indaganster
Mensajes: 8
Registrado: 15/05/2009 1:21 pm
Ubicación: Mexico

Re: tokenizar cadena

#5 Mensaje por Indaganster » 22/11/2016 2:24 pm

Pues esa seria una opción, pero habrá alguna manera de que lo haga sin tener el '|' en frente ya que esto es lo que indica que se
trata del ultimo token a extraer. Gracias por toda la ayuda y saludos.

Avatar de Usuario
daltomi
Mensajes: 354
Registrado: 28/04/2007 7:29 pm
Ubicación: Argentina

Re: tokenizar cadena

#6 Mensaje por daltomi » 22/11/2016 3:23 pm

El parche sería algo así (lo que se indica con <-(+) es nuevo):

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX 100
bool tokenizer(char *s,char sep,char *token,int *aux);
int main()
{
    char str[MAX]={"Juan|Pedro|Pablo|Carlos"},
            token[MAX] = {'\0'}; // <-(+)
    int aux=0;
	bool continuar; // <-(+)

	do { // <-(+)
		continuar = tokenizer(str,'|',token,&aux);
        printf(" %s\n",token);
	} while (continuar);
	return 0;
}

//s = cadena original
// sep=caracter que marca el token
// token = cadena destino que guardara el token extraido
//  aux = numero de posicion del token a extraer (0,1,2.....)
bool tokenizer(char *s,char sep,char  *token,int *aux)
{
    int i=0,j=0;
    bool flag = false;
    int t=0;
    while(s[i]!='\0')
    {
        if(s[i]!=sep)
         {
             token[j]=s[i];
            j++;
         }

         if(s[i]==sep)
         {
             if(t==*aux)
                {flag=true;
                  token[j]='\0';
                  break;
                 }
              else
              {
                  t++;
                  j=0;
              }
         }
          i++;

    }
    ++*aux; //<-(+)
    return flag;
}
Saludos.

Btw, voy de viaje unos días.

Indaganster
Mensajes: 8
Registrado: 15/05/2009 1:21 pm
Ubicación: Mexico

Re: tokenizar cadena

#7 Mensaje por Indaganster » 22/11/2016 3:56 pm

Muchísimas gracias, ahora todo funciona tal como quería,:D ahora podre continuar en este gran mundo del lenguaje c.
creo que el tema se puede dar por cerrado, de nuevo gracias y mucha suerte en tu viaje.

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 6 invitados