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

PCaseiro

Problema Pointeiros

Mensagens Recomendadas

PCaseiro    0
PCaseiro

Boas malta, tenho um problema com ponteiros. Num projeto vou precisar de pedir o bi ao utilizador várias vezes, pelo que decidi fazer uma função que pedisse o bi para não ter que estar sempre a pedir:

char* pede_bi(char *bi){
printf("Introduza os 8 digitos do BI do doente: ");
fgets(&bi,MAX,stdin);
return bi;
}

função esta que é chamada em:


typedef struct data{

int dia,mes,ano,hora,minutos;

}Data;


typedef struct pnode *paciente;

typedef struct pnode{

char *bi;
char nome[MAX];
Data *info_data;
paciente next;

}pnode;




void admissao_triagem(paciente triagem){
Data d1;
char nome[MAX];
char novo[MAX];
char *bi = (char*)malloc(MAX*sizeof(char));
int dia, mes, ano, hora, minuto,flag = 0;
/* pedir e verificar se o nome introduzido é válido */
do{
 fflush(stdin); /* apaga a memória local */
 printf("Nome: ");
 fgets(nome, MAX, stdin);
 strcpy(novo,paragrafo(nome));
 if ((verifica_nome(novo)==0))
	 printf("Nome Invalido\n");
} while(verifica_nome(novo)!=1);
/* pedir e verificar se o bi é válido */ do{
 fflush(stdin);
 bi = pede_bi(&bi);
 if ((verifica_bi(&bi)==0))
	 printf("BI invalido\n");
}while (verifica_bi(&bi)!=1);

/* pedir e verificar se a data é válida */ do{
 fflush(stdin);
 printf("Data (DD/MM/AAAA): ");
 if (scanf("%d/%d/%d", &d1.dia, &d1.mes, &d1.ano)!=3){
	 printf("A data introduzida não esta no formato DD/MM/AAAA\n");
 }
 else{
	 if(data_valida(&d1)==0){
		 printf("A data introduzida nao esta correcta\n");
	 }
	 else{
		 flag=1;
	 }
 }
}
 while(flag!=1);
/* inscrever_triagem(lista, bi, nome, dia, mes, ano, hora, minuto);*/ flag=1;
/* verificar se a hora é válida */ do{
 fflush(stdin);
 printf("Hora(HH:MM): ");
 if (scanf("%d:%d", &d1.hora, &d1.minutos)!=2){
	 printf("A hora introduzida não esta no formato HH:MM\n");
	 flag=0;
 }
}
while(flag!=1);
inscrever_triagem(triagem,&bi,nome,&d1);
}

void inscrever_triagem(paciente triagem, char *bi, char nome[MAX], Data *d1){
paciente aux;
aux = (paciente)malloc(sizeof(pnode));
if (aux!=NULL){
aux->info_data = (Data*) malloc(sizeof(Data));
aux->bi = (char*) malloc((MAX)*sizeof(char));
strcpy(aux->bi,bi);
strcpy(aux->nome, nome);
aux->info_data->dia = d1->dia;
aux->info_data->mes = d1->mes;
aux->info_data->ano = d1->ano;
aux->info_data->hora = d1->hora;
aux->info_data->minutos = d1->minutos;
aux->next=triagem->next; /* aux->next = NULL */
triagem->next=aux; /* juntar o nó com dados do paciente ao final da lista */
}
else
printf("ERRO!!");
}

O problema que estou a ter é que quando peço para imprimir o bi com esta função:

void imprime_lista (paciente triagem){
paciente l = triagem->next; /* Salta o header */
while (l){
 printf("Paciente: %s BI: %s\n",l->nome,l->bi);
 printf("Data: %d/%d/%d \t Horas: %d:%d", l->info_data->dia,l->info_data->mes,l->info_data->ano,l->info_data->hora,l->info_data->minutos);
 printf("\n");
 printf("\n");
 printf("\n");
 l=l->next;
}
}

ele imprime: Nome: pedro(por exemplo) Bi: primeiros 4 valores que inseri no bi + o nome, isto é, se inserir 12345678 ele imprime 1234pedro.

Alguma ajuda?

Editado por apocsantos
geshi

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Bernardo Vieira    1
Bernardo Vieira

Olá Caseiro, certamente não vou resolver o teu problema todo, mas vou dar uma ajuda.

Em vez de fgets podes usar gets, já que estás a usar o teclado como input

http://www.tutorialspoint.com/c_standard_library/c_function_gets.htm

Eu percebo que uses para limitar o número de caracteres de input. Mas tens outras formas de o fazer

depois, "bi = pede_bi(&bi);"

eu acho isso grande asneira. Não sou mestre em ponteiro, mas algo me diz que só um "pede_bi(bi);" deve funcionar

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
PCaseiro    0
PCaseiro

Obrigado pela resposta, mas acho que não vou usar gets por questões de segurança. Quanto à parte de fazer apenas pede_bi(&bi) experimentei e também não resultou :/

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Bernardo Vieira    1
Bernardo Vieira

Imprime o valor de bi algures no teu codigo para ver onde está o erro. Tipo isso

void inscrever_triagem(paciente triagem, char *bi, char nome[MAX], Data *d1){
   printf("bi - triagem : %s\n", bi);
   paciente aux;

assim já ficas a saber se o bi está a chegar bem a função e o problema é dentro dela, ou se o problema é antes. Não estou a conseguir ver assim nada de especifico

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
PCaseiro    0
PCaseiro

no fgets dá-me warning de compilador ao dizer que está à espera de char * mas o argumento is of type char **

outro bug, insiro uma vez os dados de um paciente e ele aceita. insiro para outro doente e diz sempre bi inválido, é de não fazer free?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1139
HappyHippyHippo

responde só a esta questão : porque estás a alocar memória para esse valor já que não o fazes para mais nenhum ?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
PCaseiro    0
PCaseiro

responde só a esta questão : porque estás a alocar memória para esse valor já que não o fazes para mais nenhum ?

Porque mais à frente no projeto vou precisar de ter acesso aos pacientes, acesso este que tem que ser feito por BI, dai ter alocado dinamicamente :s

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1139
HappyHippyHippo

Porque mais à frente no projeto vou precisar de ter acesso aos pacientes, acesso este que tem que ser feito por BI, dai ter alocado dinamicamente :s

o que acabaste de dizer não explica a razão de alocares dinamicamente a memória ao contrário de outros campos da estrutura ...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
PCaseiro    0
PCaseiro

o que acabaste de dizer não explica a razão de alocares dinamicamente a memória ao contrário de outros campos da estrutura ...

Realmente, eu até sei o tamanho do BI (8 digitos) por isso penso que não vale a pena alocar dinamicamente, certo?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1139
HappyHippyHippo

os números são normalmente com 8 dígitos, mas não existe essa limitação. o que quer dizer que e for necessário o IRN pode aumentar o número de dígitos necessários.

além disso, quantos caracteres necessitas para guardar uma c-style string com 8 dígitos ?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
PCaseiro    0
PCaseiro

os números são normalmente com 8 dígitos, mas não existe essa limitação. o que quer dizer que e for necessário o IRN pode aumentar o número de dígitos necessários.

além disso, quantos caracteres necessitas para guardar uma c-style string com 8 dígitos ?

9?

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


×

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.