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

lesiano

Erros estúpidos.

5 mensagens neste tópico

Olá malta, estou a tentar fazer a leitura de uma string para uma estrutura. Ando há 2 semanas a fazer isso sem problema nenhum, mas hoje...  :eek:

Ao tentar ler uma string para um apontador para char dá segmentation fault. Mas corro com o gdb e dá:

ou "in memcpy" ou "_IO_vscanf"...

Aqui fica o código:

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

typedef struct nodo{
            int cont;
                    char *nome;
             	    struct nodo *esq;
            	    struct nodo *dir;
    	    }*ABInt;


/*  Cabeçalhos  */
//ABInt insere (ABInt cabeca, int cont);
void listar (ABInt cabeca);
void insere (ABInt *cabeca, int numero);
void get_by_number (ABInt cabeca, int n);


int vff(){
int g;

scanf("%d", &g);
return g;
}

int main(){
   ABInt cabeca = NULL;

   int valor,t;
           char op, teste, *nome;
           
           
   do{

              printf("\t\t _____________________________\n");

              printf("\t\t|                             |\n");
              printf("\t\t| r -> Registar cliente       |\n");

              printf("\t\t| l -> Listar os clientes     |\n");

              printf("\t\t| p -> Pesquisar cliente      |\n");

              printf("\t\t| s -> sair                   |\n");

              printf("\t\t|_____________________________|\n\n");

              printf(":");

              

              scanf(" %c",&op);

      teste = fgetc(stdin);              


              switch(op){
                         case 'r': system("clear");

                                   printf("***********   Registo de novo cliente   ************\n\n\n");
                                   valor = vff();
			   //fgets(nome, 100, stdin);
   		           insere(&cabeca, valor);

                                   break;
   	         case 'l': system("clear");

                                   printf("***********   Listar   ************\n\n\n");
   		           listar(cabeca);
			   printf("\n");

                                   break;
		 case 'p': system("clear");

                                   printf("***********   Encontrar cliente   ************\n\n\n");
   		           scanf("%d",&t);
			   get_by_number(cabeca, t);
			   printf("\n");

                                   break;
                         case 's': return 0;

			 default : printf("Opcao nao valida!\n");

              

                         }

      }while((op != 's') && (op != 'S'));
   return 0;
   }

void insere (ABInt *cabeca, int numero){
			        		if(*cabeca == NULL){
						    *cabeca = (ABInt) malloc(sizeof(struct nodo));
						   (*cabeca)->esq = NULL;
					           (*cabeca)->dir = NULL;
						   (*cabeca)->cont = numero;
                                                           [b]char *nome33;							  
                                                           fgets(nome33, 100, stdin);
			                           (*cabeca)->nome = (char*)strdup(nome33);[/b]
			    			    }
				else{
				     if(numero < (*cabeca)->cont)  insere(&(*cabeca)->esq, numero);
				     if(numero > (*cabeca)->cont)  insere(&(*cabeca)->dir, numero);
			             }
				}

void listar (ABInt cabeca){

if(!cabeca){
            }
else{
     printf("%d, ",cabeca -> cont);
     listar(cabeca->esq);
     listar(cabeca->dir);
     }
			}

void get_by_number (ABInt cabeca, int n){

				 ABInt actual = cabeca;

			         if (n==(actual->cont)){
                                                                printf("%s",actual->nome);
                                                                }
                                         else if (n<(actual->cont)){
                                                                    get_by_number (actual->esq, n);
                                                                    }
					 else if (n>(actual->cont)){
                                                                    get_by_number (actual->dir, n);
                                                                    }
                                         else{
                                              printf("Nao existe o cliente");
                                              }
                                         }

A zona onde aparecem os erros estão a bold.

Obrigado desde já.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

nome33 não é uma string, é um apontador para caracter.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Ao tentar ler uma string para um apontador para char dá segmentation fault.

Sabes qual é o erro?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O erro é que estás a querer ler uma string para um apontador. É a típica confusão que fazem com char str e char *str que é passado como parâmetro nas funções.

Ex:

int main(void) {
char str[100];
funcao(str);
return 0;
}

void funcao(char *str) { ... }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ia jurar que tinha feito o malloc do "nome".

A solução do problema era obviamente alocar espaço para o apontador nome:

char *nome = (char*) malloc (100*sizeof(char));

Isso já funciona, porém acontece um "ignore" à instrução de leitura de string "fgets", só metendo duas vezes é q a lê, mesmo o fflush... alguém tem algo a dizer?

Obg.

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