Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

SpecialOne

Problema ao consultar uma estrutura

Mensagens Recomendadas

SpecialOne

Ola, no seguinte codigo criei uma estrutura com o objectivo de juntar as abreviaturas e o respectivo signficado, a inserção esta a funcionar, o que não esta a funcionar é a consulta. Quando consulto o significado de uma abreviatura é me devolvido lixo, alguem pode ajudar-me ?


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

typedef struct sAbreviaturas{
char *ab;
char *ex;
struct sAbreviaturas *next;	
} Definicao;

Definicao *insereAbrev(char *a, char *s,Definicao *d)
{
if(d == NULL){
	Definicao *d = (Definicao*) malloc(sizeof(Definicao));
	d -> ab = a;
	d -> ex = s;
	d -> next = NULL;
	return d;
	}
	else{
		Definicao *aux = (Definicao*) malloc(sizeof(Definicao));
		aux -> ab = a;
		aux -> ex = s;
		aux -> next = d;
		return aux;
		}
}

int consulta(char *a, char *b, Definicao *d){

Definicao *aux;

for(aux = d ; aux -> next != NULL ; aux = aux->next)
{
	if(aux -> ab == a) 
		b = strdup(aux->ex);
}
printf("Valor de c %s\n",a);
return 0;
}

int main(){

char abr[20];
char *ret;

Definicao *d = NULL;

Definicao *i = NULL;

d = insereAbrev("cqd","como queria demonstrar",d);
d = insereAbrev("td","tudo",d);
d = insereAbrev("prt","pronto",d);
d = insereAbrev("pe","por exemplo",d);
d = insereAbrev("ctz","certeza",d);
d = insereAbrev("mm","mesmo",d);
d = insereAbrev("pq","porque",d);

// funcção que dada a abreviatura imprime a expansão

printf("Insira a abreviatura a consular\n");
scanf("%s",abr);

consulta(abr,ret,d);

printf("Abreviatura = %s, Expansao = %s\n",abr,ret);


for(i = d; i!=NULL ; i = i->next){
printf("(Abrev,Expan) = (%s,%s)\n",i->ab,i->ex);
}

return 0;
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
SpecialOne

Ja vi que um dos erros estava na função consulta, estava na forma como eu comparava as strings. A nova função consulta ficou:


int consulta(char *a, char *b, Definicao *d)
{

Definicao *aux;

for(aux = d ; aux -> next != NULL ; aux = aux->next)
{
	if(strcmp(aux->ab,a) == 0)  
		b = strdup(aux->ex);
}
return 0;
}

Mesmo assim não ficou a funcionar.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Cynary

Tens um problema grave no teu código ...

Quando passas um ponteiro, estás a passar o local para onde o ponteiro está a apontar, e ao alterares esse local, é que alteras o ponteiro. No entanto, se na função alterares o endereço do ponteiro, fora da função, esse endereço não é alterado.

O que tu fazes aqui:

b = strdup(aux->ex)

é alterar o endereço de b. b é uma variável local, o que significa que a correspondente (ret) continuará a apontar para um local aleatório.

Quando sais da função, o conteúdo desse local aleatório é o que é imprimido.

O que tens de fazer, é definir a variável ret, ora através de malloc, ou estaticamente (array), e depois passá-la para a função, e em vez de usares a função strdup para atribuir ao destino de b a string, utilizas a função strcpy(b,aux->ex), alterando assim o local de destino de b (que corresponderá ao local de destino da ret).

Não te esqueças é de alocar a memória (estática ou dinamicamente) para a ret, ou terás um segmentation fault.

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.