Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Dudas en mi implementacion

Estas en el tema de Dudas en mi implementacion en el foro de C/C++ en Foros del Web. Hola amigos, llevo rato buscando en mi codigo donde esta el error, les describo lo que tengo hecho y lo que me sucede. 1. Leo ...
  #1 (permalink)  
Antiguo 02/01/2014, 14:02
Avatar de cronopiomx  
Fecha de Ingreso: mayo-2012
Ubicación: Programing Cloud
Mensajes: 282
Antigüedad: 11 años, 11 meses
Puntos: 28
Pregunta Dudas en mi implementacion

Hola amigos, llevo rato buscando en mi codigo donde esta el error, les describo lo que tengo hecho y lo que me sucede.

1. Leo un fichero que contiene varias lineas, en este caso:
fichero: "testcode1.c" (no importa la extension)
dentro del fichero esta esto (2 lineas solamente):

int c, d;
float number;


2. Esas lineas las separo con strtok, las separo por espacion, coma y pto. coma.

3. Cada palabrita separada la inserto en una estructura de datos Queue (Cola), o sea cada nodo tendra dentro, [int]->[c]->[d]->[float]->[number], y asi sucesivamente.

El caso es que capturo las lineas del fichero de esta forma:
Código:
 fgets( buffer, 100, in )
y despues le aplico strtok, y la palabra captada por el puntero pointer se la envio a la funcion Insert de la cola.


Mi problema es que al iterar sobre la primera linea (int c, d;), me asigna bien la cabeza de la cola 'qhead', pero al iterarsobre la segunda linea (float number;), y al insertar en la cola, me cambia la cabeza o qhead por float y eso esta mal, deberia quedarse con la cabeza inicial, que es la inicial del fichero (int).

He mirado y el valor de qhead cambia cuando fgets lee de nuevo y asigna a la variable buffer.

Que puede suceder?

Mi Implementacion
Código:
// cola.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct token
{  
    char * token_name;
    int row;
    struct token * next;
};

struct token * qhead = NULL;
struct token * qend = NULL;

void push(char * name, int row) //inserto en la cola
{	
	struct token *temp = (struct token*)malloc(sizeof(struct token));	      
	
    temp->token_name = name;
    temp->row = row;
	
	temp->next=NULL;
	
	if(qhead==NULL)
	{
		qhead=temp;
	}
	else
	{
		qend->next = temp;
	}
	qend = temp;
}

struct token * tokensenqueue (char * Cfilename) //leo el fichero, pico, y mando a insertar
{        
    char buffer [100];
    FILE *in = fopen ( Cfilename , "r");    

    char *pointer = NULL;    
    char delimiters[]   = " ,;\t\n";
	char xx[100];
    
    int rowcount = 0;

    while ( fgets( buffer, 100, in ) )
    {		 
          rowcount++;
          
          pointer = strtok( buffer, delimiters ); 
          while( pointer != NULL )
          {
             printf("%s %d\n", pointer, rowcount );             
			 
             push( pointer, rowcount );                                       
             
             pointer = strtok( NULL, delimiters );
          }		 
    }
  return qhead;
}

int  main()
{
    tokensenqueue("testcode1.c");
    printf("\n%s\n", qhead->token_name);    
    
    return 0;
}
  #2 (permalink)  
Antiguo 02/01/2014, 17:26
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Dudas en mi implementacion

strtok modifica el string que se le pasa inicialmente, por tanto sucesivas invocaciones con el mismo buffer, mostrará datos cambiados, como ves que ocurre.

Sugiero que cambies:

Código C:
Ver original
  1. temp->token_name = name;

por

Código C:
Ver original
  1. temp->token_name = strdup(name);

para crear memoria nueva (y copiar en ella lo que ya tienes) cada vez que cuentas con un nuevo string.
__________________
Visita mi perfil en LinkedIn
  #3 (permalink)  
Antiguo 03/01/2014, 09:32
Avatar de cronopiomx  
Fecha de Ingreso: mayo-2012
Ubicación: Programing Cloud
Mensajes: 282
Antigüedad: 11 años, 11 meses
Puntos: 28
Respuesta: Dudas en mi implementacion

Hola Calgary, gracias por su ayuda, ya he probado y funciona.

saludos
cronos

Etiquetas: dudas, funcion, implementacion, int, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:22.