guilhoto 1 Denunciar mensagem Publicado 13 de Maio de 2013 (editado) #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 13 de Maio de 2013 por guilhoto Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
HappyHippyHippo 1185 Denunciar mensagem Publicado 13 de Maio de 2013 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 Portugol Plus Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
guilhoto 1 Denunciar mensagem Publicado 13 de Maio de 2013 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 1185 Denunciar mensagem Publicado 13 de Maio de 2013 (editado) 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 13 de Maio de 2013 por HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
guilhoto 1 Denunciar mensagem Publicado 13 de Maio de 2013 o +2 foi completamente rage...desculpa...e que com +1 tambem da o mesmo... Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
pmg 96 Denunciar mensagem Publicado 13 de Maio de 2013 (editado) 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 13 de Maio de 2013 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 1 Denunciar mensagem Publicado 13 de Maio de 2013 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 96 Denunciar mensagem Publicado 13 de Maio de 2013 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 1 Denunciar mensagem Publicado 13 de Maio de 2013 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 67 Denunciar mensagem Publicado 14 de Maio de 2013 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