[C con Clase] programando un AFN a AFD

Salvador Pozo salvador en conclase.net
Sab Sep 29 02:27:47 CEST 2007


El pasado 2007-09-28 23:07:09, Unix Esc escribió:
 
Hola:

UE> estoy haciendo un proyecto de automatas,
UE> y tengo problemas en lo siguiente:
UE> defino un puntero *token, el cual voy extrayendo 
UE> tokens de una cadena de texto leida de un archivo
UE> token=strtok(cadena,",");
UE> y la segunda llamada asi:
UE> token=strtok(NULL,",");
UE> ahora bien, esas porciones que extraigo, las 
UE> quiero pasa a una variable tipo char
UE> char pedacito[20]
UE> lo hago asi:
UE> strcpy(pedacito,token);
UE> ahora, al trabajar la variable pedacito, al 
UE> mostrar su valor, si lo muestra con un printf, pero 
UE> a esta variable pedacito tambien le aplico 
UE> un strtok() (despues de mostrar su valor con 
UE> printf) para extraer otros tokens de esa,
UE> y alli es donde tengo el problema, porque el 
UE> programa se cuelga y no hace lo que debo
UE> lo que pienso es que se estoy pasando la 
UE> referencia y no el valor,

Las llamadas a strtok no se pueden anidar, es decir, si extraes un "token" de una cadena, y luego extraes nuevos "tokens" de esa segunda cadena, ya no podrás volver a extraer "tokens" de la primera cadena.

No entiendo por qué se queda colgado tu programa, sencillamente, debería dar por terminada la extracción de "tokens", y nada más. Si se cuelga, seguramente, es por otro problema.

En cualquier caso, necesitas enfocar el problema desde otro ángulo, ya que no puedes usar strtok de ese modo.

Por ejemplo:
----8<------
#include <iostream>
#include <cstring>

using namespace std;

int main()
{
   char cadena[] = "perro;4;1,gato;4;1,gallina;2;1";
   char *tok;
   char *tok2;
   char *resto;
   char pedazo[45];

   tok = strtok(cadena, ",");

   while(tok) {
       strcpy(pedazo, tok);
       // Guardar posición:
       resto = &tok[strlen(tok)+1]; // (1)
       tok2 = strtok(pedazo, ";");
       while(tok2) {
           cout << tok2 << endl;
           tok2 = strtok(NULL, ";");
       }
       cout << ":::" << endl;
       tok = strtok(resto, ","); // (2)
   }

   getchar();
   return 0;
}
----8<------

En (1) almacenamos la posición de la cadena que aún no ha sido procesada, de modo que podamos seguir extrayendo "tokens" en (2).

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


Más información sobre la lista de distribución Cconclase