Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

BrunoMartins

Dúvida em strtok

Mensagens Recomendadas

BrunoMartins

Boa noite, durante o estudo surgiu-me aqui um problema, a variável b fica a null, ou seja quando se vai fazer o strtok dá falha de segmentação,alguém me pode dizer o que pode ser?

PRODUTO * ler_ficheiro(char *caminho) {

FILE * produto;
PRODUTO *L= NULL;
PRODUTO * nv;
produto = fopen("produto.txt","r");
char *a,*b,*c;
char linha[25],linhab[25],linhac[25];
//char carac[15];
int id,stock;
double preco;

   if (produto==NULL) //ficheiro vazio
           return(0);

   while (fgets(linha, 25, produto)!=NULL)
   { //se o ficheiro nao estiver vazio

   nv = makenode();

         a=strtok(linha,";");
         id=atoi(a);
         b=strtok(linhab,",");printf("b:%s\n",b);
         stock=atoi(b);//AQUI DA A FALHA DE SEGMENTAÇÂO
         c=strtok(linhac,"\n");
         preco=atof(c);
         nv->id=id;
   nv->stock=stock;
   nv->preco=preco;

printf("AHAHAHA:%d\n",stock);
   L=iserirarvore(L,nv);

   //printf("Balanciei a arvore\n");
   //getchar();
   //printf("_%s _%s\n",linha,linhab);
       //printf("BI:%s\n Caracteristicas:%s\n",a,b);   
   }//while
fclose(produto);
L=balanceararvore(L);
return(L);
}

Editado por pmg
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

b=strtok(linhab,",");

o array linhab não foi inicializado, logo a função strtok, por acaso, não encontrou nenhum caracter 'n', o valor de NULL é retornado e atribuído à variável b

http://linux.die.net/man/3/strtok

The strtok() and strtok_r() functions return a pointer to the next token, or NULL if there are no more tokens.


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
eatg75

Assim a primeira notei alguns erros e os identifiquei.

PRODUTO* ler_ficheiro(char* caminho)
{
   FILE* produto; // inicializa as tua variaveis
   PRODUTO* L = NULL;
   PRODUTO* nv = NULL; // seria uma boa pratica inicializares as teus ponteiros
   produto = fopen("produto.txt","r");
   char* a, *b, *c;
   char linha[25],linhab[25],linhac[25];
   // char carac[15];
   int id, stock; // inicializa as tuas variaveis!
   double preco;  // faz o mesmo aqui
   if (produto == NULL) //ficheiro vazio OU NAO EXISTE, NAO TENS PERMISSAO PARA O LER.
    return 0; // nao precisas de utilizar os parenteses aqui
   while (fgets(linha, 25, produto)!=NULL)
   { //se o ficheiro nao estiver vazio

    nv = makenode();
    a = strtok(linha,";"); // atencao que o strtok() retorna NULL caso nao encontrar uma
						   // token ao tentar partir a string pelo(s) delimitador(es)
    // como o strtok() pode retornar NULL deves sempre fazer a verificacao se a string
    // devolvida nao e NULL de forma a utilzares, ou fazer outra coisa caso for NULL.
    if (a) id = atoi(a);
    // b = strtok(linhab,","); // nao inicializaste a "linhab"
    // podes fazer isto
    b = strtok(NULL ,","); // nao inicializaste a "linhab"

    if (b)
    {
	    printf("b:%s\n",b);
	    stock = atoi(b); // possivelmente estas a utilizar uma variavel que esteja a NULL
    }

    // c = strtok(linhac,"\n"); // "linhac" nao esta inicializada
    c = strtok(NULL,"\n"); // "linhac" nao esta inicializada

    if (c) preco = atof(c); // penso que era isto que querias fazer.
    // estas a utilizar estas 3 variaveis sem as ter a inicializadas antes.
    // o que faz este teu while e os strtok(), e todo o resto que do codigo acima
    // sem sentido.
    nv->id = id;
    nv->stock = stock;
    nv->preco = preco;
    printf("AHAHAHA:%d\n", stock); // estas a utilizar uma variavel nao que nao utilizaste

    // O "L" nao foi inicializado ainda
    // se esta tua arvore for a responsavel por libertar memoria dos seus nos, poderas ter problemas
    // utilizando o L desta forma, nao posso dizer mais pois nao conheco a implementacao interna da
    // tua arvore.
    L = iserirarvore(L,nv);

    //printf("Balanciei a arvore\n");
    //getchar();
    //printf("_%s _%s\n",linha,linhab);
    //printf("BI:%s\n Caracteristicas:%s\n",a,b); 
   } //while
   fclose(produto);
   L = balanceararvore(L);
   return L;
}

Podias disponibilizar a implentacao da tua arvore?

  • Voto 1

Victarion seized the dusky woman by the wrist and pulled her to him.

Victarion - She will do it. Go pray to your red god. Light your fire, and tell me what you see.

Moqorro's dark eyes seemed to shine.

Moqorro - I see dragons.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
BrunoMartins

O problema está resolvido era mesmo a questão das variáveis linhab e linhac no lugar delas substitui por null no strtok e já ficou a árvore como deve ser, posso disponibilizar a função de inserir na árvore se assim quiserem.

Obrigado pela ajuda

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
eatg75

Nao o preciso para nada de especifico, estava apenas curioso sobre a implementacao da arvore. Se pudesses disponibilizar agradecia.


Victarion seized the dusky woman by the wrist and pulled her to him.

Victarion - She will do it. Go pray to your red god. Light your fire, and tell me what you see.

Moqorro's dark eyes seemed to shine.

Moqorro - I see dragons.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
BrunoMartins

Ora aqui está ela :)

PRODUTO * iserirarvore(PRODUTO * arvore, PRODUTO * nodo){


 if (arvore == NULL) {
   return(nodo);
 }

if(nodo->id <= arvore->id)
 {
  if(arvore->esq != NULL)
    iserirarvore(arvore->esq, nodo);
  else
    arvore->esq = nodo;
 }
else
 {
  if(arvore->dir != NULL)
    iserirarvore(arvore->dir, nodo);
  else
    arvore->dir = nodo;
 }


  /* if (nodo->bi < arvore->bi)
   arvore->esq = iserirarvore(arvore->esq, nodo);
   else
   arvore->dir = iserirarvore(arvore->dir, nodo);*/
   return(arvore);

}

Editado por pmg
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.