Ir para o conteúdo
guilhoto

compila mas em alguns testes mooshak da SIGSEGV

Mensagens Recomendadas

guilhoto

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXLINESIZE 1025
#define NUMSEP 9

typedef struct node{
   char* palavra;
   struct node *next;
   int linha;
   int apagada;
} *link;


typedef struct ocorrencia{
   char* palavra;
   struct ocorrencia *next;
   int numero;
} *Ocorrencia;

link head=NULL;
Ocorrencia head2=NULL;


Ocorrencia NEW2(char* palavra){
   Ocorrencia x;
   x=(Ocorrencia)malloc(sizeof(struct ocorrencia)+1);
   x->palavra=(char*)malloc(sizeof(char)*(strlen(palavra)+2));
    strcpy(x->palavra,palavra);
   x->next= NULL;
   return x;
}

link NEW(char* palavra, int numlinha){
   link x;
   x=(link)malloc(sizeof(struct node)+1);
   x->palavra=(char*)malloc(sizeof(char)*(strlen(palavra)+1));
    strcpy(x->palavra,palavra);
   x->next= NULL;
   x->linha=numlinha+1;
   return x;
}

Ocorrencia insertEnd2(Ocorrencia head, char*text){
   Ocorrencia x;
   if(head2==NULL){
       return NEW2(text);
   }
   for(x=head2;x->next !=NULL;x=x->next);
   x->next=NEW2(text);
   return head2;
}


link insertEnd(link head, char*text, int numlinha){
   link x;
   if(head==NULL){
       return NEW(text,numlinha);
   }
   for(x=head;x->next !=NULL;x=x->next);
   x->next=NEW(text,numlinha);
   return head;
}


const char separators[] = { ' ','\t',',',';','.','?','!','"','\n' };
void split(char *line,int numlinha){
   Ocorrencia t;
   int i, j, k;
   char buffer[MAXLINESIZE];
   for(i = 0, k = 0; line[i] != '\0'; i++, k++) {
       buffer[k] = tolower(line[i]);
       for(j = 0; j < NUMSEP; j++) {
           if(line[i] == separators[j]) {
               if(k != 0) {
                   buffer[k] = '\0';
                   head=insertEnd(head,buffer,numlinha);
                   for(t=head2; t!=NULL; t= t->next){
                           if(strcmp(t->palavra,buffer)==0){
                               t->numero++;
                               break;
                           }
                   }
                   if(t==NULL){
                       head2=insertEnd2(head2,buffer);
                       }
               }
               k = -1;
           }
       }
   }
}



void delete(char* palavra){
   link t;
   Ocorrencia y;
   for(t=head; t!=NULL; t= t->next){
       if(strcmp(t->palavra,palavra)==0){
           t->apagada=1;
       }
   }
   for(y=head2; y!=NULL; y=y->next){
       if(strcmp(y->palavra,palavra)==0){
           y->numero=-1;
       }
   }
}    


void apagada(char*palavra,char texto[], int linha){
   link t;
   for(t=head; t!=NULL; t=t->next){
       if(strcmp(t->palavra,palavra)==0 && t->linha==linha+1){
               if(t->apagada!=1){
                   printf("%d %s", linha+1, texto);
               }
       }
   }
}


void consecutivas(char* palavra, char* palavra2,char texto[],int linha){
   int i=0, j=0;
   link t;
   while(palavra[i]!='\0'){
       palavra[i]=tolower(palavra[i]);
       i++;
   }
   while(palavra2[j]!='\0'){
       palavra2[j]=tolower(palavra2[j]);
       j++;
   }
   for(t=head;t!=NULL;t=t->next){
       if(strcmp(t->palavra,palavra)==0 && t->linha==linha+1 && t->next != NULL && t->apagada!=1){
           if(strcmp(t->next->palavra,palavra2)==0 && t->next!=NULL){
               printf("%d %s", linha+1, texto);
               break;
           }
       }
       else if(strcmp(t->palavra,palavra2)==0 && t->linha==linha+1 && t->next != NULL && t->apagada!=1){
               if(strcmp(t->next->palavra,palavra)==0 &&t->next!=NULL){
                   printf("%d %s",linha+1, texto);
                   break;
               }
       }
   }
}


void ocorrencias(void){
   Ocorrencia t,x;
   char* aux;
   int aux2;
   for(t=head2; t->next!=NULL; t=t->next){
       for(x=t->next; x!=NULL;x=x->next){
           if(strcmp(t->palavra,x->palavra)>0){
               aux=t->palavra;
               t->palavra=x->palavra;
               x->palavra=aux;
               aux2=t->numero;
               t->numero=x->numero;
               x->numero=aux2;
           }
       }
   }
   for(t=head2; t!=NULL; t=t->next){
       if(t->numero>=0){
           printf("%s %d\n", t->palavra, t->numero+1);
       }
   }
}

int main(void){
   char ordem, palavraa[MAXLINESIZE],palavra2[MAXLINESIZE];
   char* texto[MAXLINESIZE];
   int numLinhas, linha=0;

   scanf("%d", &numLinhas);
   getchar();
   for(linha=0;linha<numLinhas;linha++){
       texto[linha]=(char*)malloc(MAXLINESIZE*sizeof(char));
       fgets(texto[linha],MAXLINESIZE,stdin);
       split(texto[linha],linha);

   }
   while((ordem=getchar())!=EOF){
       switch(ordem){
           case's':
               for(linha=0;linha<numLinhas;linha++){
                   printf("%s",texto[linha]);
               }
               break;
           case'f':
               scanf("%s", palavraa);
               delete(palavraa);
               break;
           case'l':
               scanf("%s", palavraa);
               for(linha=0;linha<numLinhas;linha++){
                   apagada(palavraa,texto[linha],linha);
               }
               break;

           case 'w':
               scanf("%s %s", palavraa, palavra2);
               for(linha=0;linha<numLinhas;linha++){
                   consecutivas(palavraa,palavra2, texto[linha],linha);
               }
               break;
           case'h':
               ocorrencias();
               break;
           default:
               break;
       }
   }
   free(head);
   free(head2);

   return 0;
}





alguem sabe onde e que pode haver esses erros?

muito obrigado

Editado por guilhoto

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

pontos a ter em conta :

- indenta a o código

- não esperes que uma pessoa consiga ler linhas e linhas de código à procura de um memory leak e/ou segmentation fault

- indenta a o código

- apresenta sempre a mensagem de erro e a linha do código onde o erro originou

- indenta a o código


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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
guilhoto

codigo identado. nao ha mensagem de erro nem linha de codigo...

o que aconteceu e que o programa compila. passa na maioria dos testes, mas em testes de mooshak da RunTime error: SIGSEGV

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

então vamos começar pelo início :

x = (Ocorrencia) malloc(sizeof(struct ocorrencia) + 1);
//     |                                            |
//  desnecessário                               que raio faz um 1 aqui ???
x->palavra = (char*) malloc(sizeof(char) * (strlen(palavra) + 2));
//             |                 |                            |
//       desnecessário     desnecessário = 1                 2 ? o '\0' é só um byte ...

Editado por HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Não sei se tem influência: na função insertEnd2() tens o parametro head (que tem o mesmo nome duma variavel global!!!!!) que não usas.

Sugestão #1: deixa de usar variaveis globais (elas dão mais problemas do que (à primeira vista) resolvem)

Sugestão #2: se não precisas do parametro não o passes; se precisas dele, usa-o

Editado por pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
guilhoto

mas e que se declarar no main e as passar, depois por exemplo na split quereria retornar dois tipos diferentes e o programa nao ia deixar...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Eu não sei exactamente qual é o intuito do programa, mas já experimentaste localmente com inputs esquisitos?

+ tudo vazio

+ tudo igual

+ varias linhas em branco

+ repeticoes

+ só separadores

+ ausencia de separadores

+ input de 500M

+ input de zero bytes

+ ...


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
guilhoto

pmg experimentei com todos os inputs iguais. inseri:

5

andre guilhoto

andre guilhoto

andre guilhoto

andre guilhoto

andre guilhoto

f andre

w andre guilhoto

era suposto nao obter nada pois o f esquece o andre e por isso w nao encontra nenhuma palavra adjacente andre mas ele da-me um output de

1 andre guilhoto

2 andre guilhoto

3 andre guilhoto.

calculo que o erro seja na funcao delete em que ele so esta a colocar 1 no t->apagada do ultimo elemento...mas como corrigi-lo...? meto a funcao a receber a linha e faco um for para ele fazer isso para todas as linhas? isso nao resolve o problema...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
brunoais

Se estás em linux usa isto:

http://valgrind.org/

Para mim funciona bem para me ajudar para este tipo de coisas.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

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.