Jump to content

compila mas em alguns testes mooshak da SIGSEGV


Recommended Posts

Posted (edited)
#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

Edited by guilhoto
Posted

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
Posted

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

Posted (edited)

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 ...
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Posted (edited)

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

Edited by 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!

Posted

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!

Posted

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...

Posted

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%.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.