• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

FunnyKid

Grave problema de Falta de Segmentação

9 mensagens neste tópico

Boas a todos e peço desculpa por ter um tópico inicial assim tão urgente...

Preciso de entregar um trabalho até logo e isto tá-me a dar erros de segmentação ao executar em Linux (ubuntu 7.10... Ahh o trabalho tem de dar em linux)... alguem me podia ajudar a corrigir?

É urgente mesmo

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define USER_PATH "user.dat"
#define SEQ_PATH "sequence.dat"
#define TRASH_PATH "trash.dat"
#define MAX_USER 16
#define MAX_PASS 16
#define MAX_IDENTITY 16
#define MAX_SEQTYPE 16
#define MAX_SEQUENCE 255
#define LENGTH_LN 1024
#define MAX_LINE 255
#define MAX 64
#define MAX_TUPLETO 4

typedef struct structLOG{
char username[MAX_USER];
char password[MAX_PASS];
} LOG;

typedef struct structFASTA{
char identity[MAX_IDENTITY];
char type[MAX_SEQTYPE];
char sequence[MAX_SEQUENCE];
} FASTA;

int fexists(char []);
int user_exist(char []);
int new_user(char [], int);
int any_user();
int login(LOG, char [], int);
int del_user(char [], char []);
int change_pass(LOG *);
void filecopy(FILE *, FILE *);
void menu_login(char [], int);
int freq(char,char []);
int freq_t(char [],char []);
void dna_to_rna(char [],char []);
void dna_to_dnai(char[],char []);
void reverse(char []);
void readLn(char []);
int matrizOrd(char [MAX][MAX_TUPLETO], int);
int elem(char [MAX][MAX_TUPLETO], char [], int);
void menumain(char []);
void menu_change_pass();
void menu_delete_user(char []);
void menu_show_seq();
void menu_login();
void menu_add_seq();
void menu_search_seq();
void menu_del_seq();
void menu_dna_to_rna();
void menu_dna_to_dnai();

int main(){
char current_user[MAX_USER];
if(any_user()){
	while(new_user(current_user, 1)==0);
}else{
	menu_login(current_user,1);
}
menumain(current_user);
exit(EXIT_SUCCESS);
}

int fexists(char path[]){
FILE *fp;
fp=fopen(path,"r");
if(fp!=NULL){
	fclose(fp);
	return 1;
}
return 0;
}

int user_exist(char username[]){
if(fexists(USER_PATH)){
	FILE *fp;
	LOG user;
	fp=fopen(USER_PATH,"r");
	while(fscanf(fp,"%s %s\n", user.username, user.password)==2){
		if(strcmp(username, user.username)==0){
			fflush(fp);
			fclose(fp);
			return 1;
		}
	}
	fflush(fp);
	fclose(fp);
}
return 0;
}

int new_user(char username[], int save){
LOG user;
char pass[MAX_PASS];
printf("Username: ");
scanf("%s",user.username);
fflush(stdin);
if(user_exist(user.username)){
	printf("User already exist...\n");
	return 0;
}
printf("Password: ");
scanf("%s",user.password);
fflush(stdin);
printf("Repeat password: ");
scanf("%s", pass);
fflush(stdin);
if(strcmp(pass,user.password)!=0){
	printf("The passwords did not match...\n");
	return 0;
}	
FILE *fp;
fp=fopen(USER_PATH, "a+");
fprintf(fp, "%s %s\n", user.username, user.password);
fflush(fp);
fclose(fp);
if(save){
	strcpy(username,user.username);
}
return 1;
}

int any_user(){
if(fexists(USER_PATH)){
	FILE *fp;
	LOG user;
	fp = fopen(USER_PATH, "r");
	if(fscanf(fp, "%s %s\n",user.username, user.password)==2){
		return 0;
	}else{
		return 1;
	}
}
return 1;
}

int login(LOG username, char current_user[], int save){
FILE *fp;
LOG user;
fp=fopen(USER_PATH,"r");
while(fscanf(fp,"%s %s\n", user.username, user.password)==2){
	if((strcmp(user.username, username.username)==0)&&(strcmp(user.password, username.password)==0)){
		fflush(fp);
		fclose(fp);
		if(save){
			strcpy(current_user, user.username);
		}
		return 1;
	}
}
return 0;
}

int del_user(char username[], char current_user[]){
if(strcmp(username,current_user)==0){
	return 0;
}
FILE *fp1, *fp2;
LOG user;
int status=0;
fp1=fopen(USER_PATH,"r");
fp2=fopen(TRASH_PATH,"w");
while(fscanf(fp1,"%s %s\n", user.username, user.password)==2){
	if(strcmp(user.username, username)!=0){
		fprintf(fp2, "%s %s\n", user.username, user.password);
	}else{
		status=1;
	}
}
fflush(fp1);
fflush(fp2);
fclose(fp1);
fclose(fp2);
fp1=freopen(USER_PATH,"w",fp1);
fp2=freopen(TRASH_PATH,"r",fp2);
filecopy(fp2,fp1);
fflush(fp1);
fflush(fp2);
fclose(fp1);
fclose(fp2);
return status;
}

void filecopy(FILE *ifp, FILE *ofp){
int c;
while ((c = getc(ifp)) != EOF){
	putc(c, ofp);
}
}

int change_pass(LOG *username){
FILE *fp1, *fp2;
LOG user;
int status=0;
fp1=fopen(USER_PATH,"r");
fp2=fopen(TRASH_PATH,"w");
while(fscanf(fp1,"%s %s\n", user.username, user.password)==2){
	if(strcmp(user.username, username->username)!=0){
		fprintf(fp2, "%s %s\n", user.username, user.password);
	}else{
		fprintf(fp2, "%s %s\n", username->username, username->password);
		status=1;
	}
}
fflush(fp1);
fflush(fp2);
fclose(fp1);
fclose(fp2);
fp1=freopen(USER_PATH,"w",fp1);
fp2=freopen(TRASH_PATH,"r",fp2);
filecopy(fp2,fp1);
fflush(fp1);
fflush(fp2);
fclose(fp1);
fclose(fp2);
return status;
}

void menu_login(char current[], int save){
LOG user;
while(1){
	printf("Username: ");
	scanf("%s",user.username);
	fflush(stdin);
	printf("Password: ");
	scanf("%s",user.password);
	fflush(stdin);
	if(!(login(user, current, save))){
		printf("Invalid username or password!\n");
	}else{
		break;
	}
}
}

int sequence_exists(char seq[]){
int status=0;
if(fexists(SEQ_PATH)){
	FILE *fp;
	FASTA fst;
	fp=fopen(SEQ_PATH,"r");
	while(fscanf(fp, ">%s %s %s\n", fst.identity, fst.type, fst.sequence)==3){
		if(strcmp(seq,fst.identity)==0){
			status=1;
		}
	}
	fflush(fp);
	fclose(fp);
}
return status;
}

int new_sequence(FASTA seq){
if((sequence_exists(seq.identity))){
	return 0;
}
FILE *fp;
fp=fopen(SEQ_PATH, "a+");
fprintf(fp,">%s %s %s\n",seq.identity,seq.type,seq.sequence);
fclose(fp);
fflush(fp);
return 1;
}

int del_sequence(char seq[]){
if(!sequence_exists(seq)){
	return 0;
}
FILE *fp1, *fp2;
FASTA fst;
int status=0;
fp1=fopen(SEQ_PATH,"r");
fp2=fopen(TRASH_PATH,"w");
while(fscanf(fp1,">%s %s %s\n",fst.identity,fst.type,fst.sequence)==3){
	if(strcmp(fst.identity,seq)!=0){
		fprintf(fp2,">%s %s %s\n",fst.identity,fst.type,fst.sequence);
	}else{
		status=1;
	}
}
fflush(fp1);
fflush(fp2);
fclose(fp1);
fclose(fp2);
fp1=freopen(SEQ_PATH,"w",fp1);
fp2=freopen(TRASH_PATH,"r",fp2);
filecopy(fp2,fp1);
fflush(fp1);
fflush(fp2);
fclose(fp1);
fclose(fp2);
return status;
}

int read_sequence(FASTA *fst, char seq[]){
if(fexists(SEQ_PATH)){
	FILE *fp;
	fp=fopen(SEQ_PATH,"r");
	while(fscanf(fp,">%s %s %s\n",fst->identity,fst->type,fst->sequence)==3){
		if(strcmp(seq,fst->identity)==0){
			fflush(fp);
			fclose(fp);
			return 1;
		}
	}
	fflush(fp);
	fclose(fp);
}
return 0;
}

int freq(char c, char seq[]){
int i;
int k=0;
for(i=0;seq[i];i++){
	if(seq[i]==c){
		k++;
	}
}
return k;
}

int freq_t(char tupleto[], char seq[]){
int i, k=0, t=strlen(tupleto);
for(i=0;seq[i];i++){
	if(!strncmp(tupleto,&seq[i],t)){
		k++;
		i+=(t-1);
	}
}
return k;
}

void dna_to_rna(char dna[],char rna[]){
int i;
for(i=0;dna[i];i++){
	if((rna[i]=dna[i])=='T'){
		rna[i]='U';
	}
}
}

void dna_to_dnai(char dna[],char dnai[]){
int i;
for(i=0;dna[i];i++){
	switch(dna[i]){
		case 'A':
			dnai[i]='T';
			break;
		case 'T':
			dnai[i]='A';
			break;
		case 'C':
			dnai[i]='G';
			break;
		case 'G':
			dnai[i]='C';
			break;
		default:
			dnai[i]=dna[i];
	}
}
dnai[i]='\0';
reverse(dnai);
}

void reverse(char s[]){
    int c, i, j;
    for (i = 0, j = strlen(s)-1; i < j; i++, j--) {
        c = s[i];
        s[i] = s[j];
        s[j] = c;
    }
}


int matrizOrd(char s[MAX][MAX_TUPLETO], int n){
char tmp[MAX];
int i,j;
for(i=0;i<n;i++){
	for(j=i;j>0;j--){
		if(strcmp(s[j-1],s[j])>0){
			strcpy(tmp, s[j]);
			strcpy(s[j], s[j-1]);
			strcpy(s[j-1], tmp);
		}
	}
}
return 0;
}

int elem(char s[MAX][MAX_TUPLETO], char e[], int n){
int i;
if(n==0) return 0;
for(i=0;i<n;i++){
	if(!strcmp(s[i],e)){
		return 1;
	}
}
return 0;
}

void menumain(char username[]){
int option=1;
while(option){
	printf("1 - Add user\n");
	printf("2 - Change password\n");
	printf("3 - Delete user\n");
	printf("4 - Add sequence\n");
	printf("5 - Show sequence\n");
	printf("6 - Search sequence\n");
	printf("7 - Delete sequence\n");
	printf("8 - DNA to RNA\n");
	printf("9 - DNA to DNAI\n");
	printf("0 - Exit\n");
	printf("Option: ");
	scanf("%d",&option);
	switch(option){
		case 1:
			new_user(username, 0);
			break;
		case 2:
			menu_change_pass();
			break;
		case 3:
			menu_delete_user(username);
			break;
		case 4:
			menu_add_seq();
			break;
		case 5:
			menu_show_seq();
			break;
		case 6:
			menu_search_seq();
			break;
		case 7:
			menu_del_seq();
			break;
		case 8:
			menu_dna_to_rna();
			break;
		case 9:
			menu_dna_to_dnai();
			break;
		case 0:
			exit(EXIT_SUCCESS);
			break;
		default:
			printf("Invalid option!\n");

	}
}
}

void menu_change_pass(){
LOG user;
char pass[MAX_PASS]="makia";
int status=1;	
while(status){
	printf("Username: ");
	scanf("%s", user.username);
	fflush(stdin);
	if((status=(!(user_exist(user.username))))){
		printf("Username did not exist...\n");
	}
}
printf("Password: ");
scanf("%s",user.password);
fflush(stdin);
printf("Repeat password: ");
scanf("%s",pass);
fflush(stdin);
if(strcmp(pass, user.password)!=0){
	printf("Passwords did not match!\n");
	return;
}else{
	change_pass(&user);
}
}

void menu_delete_user(char username[]){
char user[MAX_USER];
printf("Username: ");
scanf("%s",user);
fflush(stdin);
del_user(user,username);
}

void menu_add_seq(){
FASTA seq;
int status=1;
while(status){
	printf("Identity: ");
	scanf("%s",seq.identity);
	fflush(stdin);
	if((status=sequence_exists(seq.identity))){
		printf("Sequence already exist...\n");
	}
}
printf("Sequence type: ");
scanf("%s",seq.type);
status=1;
while(status){
	int A, C, T, G;
	printf("Sequence: ");
	scanf("%s",seq.sequence);
	A = freq('A', seq.sequence);
	C = freq('C', seq.sequence);
	T = freq('T', seq.sequence);
	G = freq('G', seq.sequence);
	status=(strlen(seq.sequence)-(A+C+T+G));
	if(status==0){
		new_sequence(seq);
	}else{
		printf("There is %d invalid chars...",status);
	}
}
}

void menu_show_seq(){
int option;
printf("1 - Identity\n");
printf("_ - All\n");
printf("Option: ");
scanf("%d",&option);
switch(option){
	case 1:{
		char id[MAX_SEQUENCE];
		FASTA fst;
		printf("Sequence: ");
		scanf("%s",id);
		if(read_sequence(&fst, id)){
			printf("Type: %s\nSequence: %s\n",fst.type,fst.sequence);
		}else{
			printf("Sequence does not exist...\n");
		}
		break;
	}
	default:{
		FILE *fp;
		FASTA fst;
		fp=fopen(SEQ_PATH, "r");
		while((fscanf(fp,">%s %s %s\n",fst.identity,fst.type,fst.sequence))==3){
			printf("Identity: %s\nType: %s\nSequence: %s\n",fst.identity,fst.type,fst.sequence);
		}
		break;
	}
}				
}

void menu_search_seq(){
char option;
printf("1 - Identity\n");
printf("_ - All\n");
printf("Option: ");
scanf("%d",&option);
switch(option){
	case 1:{
		char id[MAX_SEQUENCE], subseq[MAX_SEQUENCE];
		FASTA fst;
		printf("Sequence: ");
		scanf("%s",id);
		fflush(stdin);
		printf("Subsequence: ");
		scanf("%s", subseq);
		fflush(stdin);
		if(read_sequence(&fst, subseq)==0){
			int n;
			n = freq_t(subseq, fst.sequence);
			if(n==0){
				printf("Sequence not found...\n");
			}else{
				int i, t=strlen(subseq);
				printf("Sequence found %d times...\n", n);
				for(i=0;fst.sequence[i];i++){
					if(strncmp(&fst.sequence[i],subseq,t)==0){
						printf("\tPostion %d\n", (i+1));
						i+=(t-1);
					}
				}
			}
		}else{
			printf("Sequence did not exist...\n");
		}
		break;
	}
	default:{
		FASTA fst;
		FILE *fp;
		char sub[MAX_SEQUENCE];
		printf("Subsequence: ");
		scanf("%s",sub);
		fflush(stdin);
		fp=fopen(SEQ_PATH,"r");
		printf("Sequences\n");
		while((fscanf(fp, ">%s %s %s\n",fst.identity,fst.type,fst.sequence))==3){
			int n, i, t=strlen(sub);
			printf("%s -> %d:\n",fst.identity,(n=(freq_t(sub, fst.sequence))));
			for(i=0;(fst.sequence[i]&&n);i++){
				if(strncmp(&fst.sequence[i],sub,t)==0){
					printf("\tPostion %d\n", (i+1));
					i+=(t-1);
				}
			}
		}
	}
}
}

void menu_del_seq(){
int status;
char id[MAX_IDENTITY];
printf("Sequence Identity: ");
scanf("%s", id);
fflush(stdin);
status=del_sequence(id);
if(status==1){
	printf("Deleted...\n");
}else{
	printf("Sequence identity did not exist...\n");
}
}

void menu_dna_to_rna(){
int option;
printf("1 - Insert Sequence identity\n");
printf("_ - Insert Sequence\n");
printf("Option: ");
scanf("%d",&option);
fflush(stdin);
switch(option){
	case 1:{
		char id[MAX_IDENTITY];
		FASTA fst;
		printf("Sequence identity: ");
		scanf("%s", id);
		fflush(stdin);
		if(read_sequence(&fst, id)==0){
			printf("The identity is not valid!\n");
		}else{
			char rna[MAX_SEQUENCE];
			dna_to_rna(fst.sequence,rna);
			printf("DNA: %s\nRNA: %s\n",fst.sequence,rna);
		}
		break;
	}
	default:{
		char dna[MAX_SEQUENCE], rna[MAX_SEQUENCE];
		int A,C,G,T,status=1;
		while(status){
			printf("Sequence: ");
			scanf("%s",dna);
			fflush(stdin);
			A = freq('A', dna);
			C = freq('C', dna);
			G = freq('G', dna);
			T = freq('T', dna);
			status=(strlen(dna)-(A+C+G+T));
			if(status==0){
				dna_to_rna(dna,rna);
				printf("RNA: %s\n",rna);
			}else{
				printf("There is %d invalid chars...\n",status);
			}
		}
	}
}
}

void menu_dna_to_dnai(){
int option;
printf("1 - Insert Sequence identity\n");
printf("_ - Insert Sequence\n");
printf("Option: ");
scanf("%d",&option);
fflush(stdin);
switch(option){
	case 1:{
		char id[MAX_IDENTITY];
		FASTA fst;
		printf("Sequence identity: ");
		scanf("%s", id);
		fflush(stdin);
		if(read_sequence(&fst, id)==0){
			printf("The identity is not valid!\n");
		}else{
			char dnai[MAX_SEQUENCE];
			dna_to_dnai(fst.sequence,dnai);
			printf("DNA: %s\nDNAI: %s\n",fst.sequence,dnai);
		}
		break;
	}
	default:{
		char dna[MAX_SEQUENCE], dnai[MAX_SEQUENCE];
		int A,C,G,T,status=1;
		while(status){
			printf("Sequence: ");
			scanf("%s",dna);
			fflush(stdin);
			A = freq('A', dna);
			C = freq('C', dna);
			G = freq('G', dna);
			T = freq('T', dna);
			status=(strlen(dna)-(A+C+G+T));
			if(status==0){
				dna_to_dnai(dna,dnai);
				printf("DNAI: %s\n",dnai);
			}else{
				printf("There is %d invalid chars...\n",status);
			}
		}
	}
}
}


0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Coloca cá o código, se já estivesse colocado provavelmente essa dúvida urgente já tinha sido resolvida.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O único problema que detectei estava nesta função. Estavas a fazer scanf de um char com %d... em vez de com %c. Depois no switch alterei o "case 1:" para " case '1' ":

void menu_search_seq(){
char option;
printf("1 - Identity\n");
printf("_ - All\n");
printf("Option: ");
scanf("%c",&option);
switch(option){
	case '1':{
		char id[MAX_SEQUENCE], subseq[MAX_SEQUENCE];
		FASTA fst;
		printf("Sequence: ");
		scanf("%s",id);
		fflush(stdin);
		printf("Subsequence: ");
		scanf("%s", subseq);
		fflush(stdin);
		if(read_sequence(&fst, subseq)==0){
			int n;
			n = freq_t(subseq, fst.sequence);
			if(n==0){
				printf("Sequence not found...\n");
			}else{
				int i, t=strlen(subseq);
				printf("Sequence found %d times...\n", n);
				for(i=0;fst.sequence[i];i++){
					if(strncmp(&fst.sequence[i],subseq,t)==0){
						printf("\tPostion %d\n", (i+1));
						i+=(t-1);
					}
				}
			}
		}else{
			printf("Sequence did not exist...\n");
		}
		break;
	}
	default:{
		FASTA fst;
		FILE *fp;
		char sub[MAX_SEQUENCE];
		printf("Subsequence: ");
		scanf("%s",sub);
		fflush(stdin);
		fp=fopen(SEQ_PATH,"r");
		printf("Sequences\n");
		while((fscanf(fp, ">%s %s %s\n",fst.identity,fst.type,fst.sequence))==3){
			int n, i, t=strlen(sub);
			printf("%s -> %d:\n",fst.identity,(n=(freq_t(sub, fst.sequence))));
			for(i=0;(fst.sequence[i]&&n);i++){
				if(strncmp(&fst.sequence[i],sub,t)==0){
					printf("\tPostion %d\n", (i+1));
					i+=(t-1);
				}
			}
		}
	}
}
}

Já agora... Este trabalho é para que cadeira?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Já agora... Este trabalho é para que cadeira?

Falei com o professor Bambo e ele disse-me que era Laboratórios de Informática II, 1º ano, LEI, UMinho.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É um pouco dificil detectar uma falha de segmentação, e para dizer a verdade não li o teu código até orque é um pouco extenso.

a única dica que te posso dar é que me lembro de quando programava em C/C++ é que um falha de segmentação acontece quando usas memória que não reservaste com a função malloc() para o caso do C ou com o operador 'new' para o caso do C++.

Vê lá se não criar aí algurs um array para ponteiros de estruturas antes de reservar memória para elas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que pode ser explicado pelo que o tsenart indicou. %d tenta escrever 4 bytes num endereço que só está à espera de 1.

E com debug é fácil ver onde estoira.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Usa o GDB para fazeres debug... provavelmente ele diz-te onde acontece o problema...

nao li o código mas deve ser algo do tipo de aceder a espaço de memória que não devias...

com o GDB deves conseguir saber onde isso acontece...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já estive a pesquisar mais extensamente o código...

Naqueles menus em que tens a opção 1 e opção '_', tens que fazer scanf("%c") em vez de scanf("%d") e mudar o tipo da variavel para onde lês para char.

Assim já não me dá nenhum segfault.

Já agora... Evita o fflush(stdin)... Usa scanf("%*[^\n]"); scanf("%*c");

Outro conselho que te dou:

Limita o tamanho das strings que lês... Podes usar o limitador no scanf. Ex:

Queres ler no maximo 10 caracteres. Fazes scanf("%10s", string);

Mas lembra-te que isto só lê até ao espaço. Para ler com espaços fazes:

scanf("%10[^\n]", string); seguido de scanf("%*[^\n]"); scanf("%*c"); para limpar o buffer de entrada.

Cumps

tsenart

0

Partilhar esta mensagem


Link 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