Se pierde el apuntador en estructuras

mocmikat
02 de Julio del 2005
Por favor, necesito que alguien me ayude con un código en c++, que maneja estructuras, el problema, es que cuando ingreso una cadena de caracteres, y luego quiero meter otra, es decir reemplazar la primera, concatena la segunda a la primera.

mocmikat
02 de Julio del 2005
El Código es el siguiente:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <dos.h>
#include <string.h>

struct posi {
int lin;
int col;
posi *as;
};

struct pala {
char *pal;
posi *pos;
int no;
pala *as;
};
posi *ppos;
pala *wor;
pala *ap;

int twor=0;
int nlw=1;
int ncw=1;

typedef struct {
char *p;
int nc;
int nl;
} ppa;

FILE *f;

void imprime() {
clrscr();
printf("nt Listado de Token's n");

wor=ap;

while (wor!=NULL) {
if (wor->no>1) {
printf("nt %s", wor->pal);
ppos=wor->pos;

while (ppos!=NULL) {
printf("ntt %d:%d", ppos->lin, ppos->col);
ppos=ppos->as;
}

printf("ntt NT: %d", wor->no);
}
sleep(1);
}

}

void guarda(ppa *p2) {
posi *aap;
pala *aaw;

int pw=-1;

wor=ap;

int i=0;
while (wor!=NULL) {
if (wor->pal==p2->p) {
pw=i;
break;
}
wor=wor->as;
i++;
}

if (pw>=0) {
wor=ap;

for (i=0; i<pw; i++)
wor=wor->as;

ppos=wor->pos;

while (ppos!=NULL)
ppos=ppos->as;

aap->lin=p2->nl;
aap->col=p2->nc;
aap->as=NULL;
ppos->as=aap;
wor->no++;
}
else {
wor=ap;

while (wor!=NULL)
wor=wor->as;

aaw->pal="@";
aap->lin=0;
aap->col=0;
aaw->no=0;

for (int x=0; x<strlen(p2->p); x++)
aaw->pal[x]=p2->p[x];
aaw->pal[strlen(p2->p)]='';
aap->lin=p2->nl;
aap->col=p2->nc;
aap->as=NULL;
aaw->no=1;
aaw->as=NULL;

aaw->pos=aap;
wor->as=aaw;
twor++;
}

}

ppa *token() {
char c;
ppa *p1;

p1->p="@";

while ((c=fgetc(f)) !=' ' && c!='t' && c!='n' && c!='r') {
if (strcmp(p1->p,"@")==0) {
if ((c>=48 && c<=57) || (c>=65 && c<=90) || (c>=97 && c<=122)) {
p1->p[0]=c;
p1->p[1]='';
p1->nc=ncw;
p1->nl=nlw;
}
}
else
if ((c>=48 && c<=57) || (c>=65 && c<=90) || (c>=97 && c<=122))
p1->p[strlen(p1->p)]=c;
p1->p[strlen(p1->p)+1]='';
ncw++;
}

if (c=='n' || c=='r')
nlw++;

return (p1);
}

void scan(char *pal) {
ap=NULL;
ppa *pa;

if ((f=fopen(pal,"rw")) ==NULL) {
printf("nt El archivo no se pudo abrir...");
getche();
exit(1);
}

while (!feof(f)) {
pa=token();

if (pa->p!="@")
guarda(pa);
}

fclose(f);
}

void main() {
char *pal;

printf("nt De el archivo a revisar: ");
gets(pal);

if ((f=fopen(pal,"rw")) ==NULL) {
printf("nt El archivo no existe...");
getch();
exit(1);
}

fclose(f);
scan(pal);
imprime();
}