Jump to content
guilhoto

compila mas em alguns testes mooshak da SIGSEGV

Recommended Posts

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

Edited by guilhoto

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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 ...

Edited by HappyHippyHippo

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

Share this post


Link to post
Share on other 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

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!

Share this post


Link to post
Share on other 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...

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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...

Share this post


Link to post
Share on other 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%.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


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