Ir ao conteúdo
  • Cadastre-se
Gabriel Lemos Alves

RESOLVIDO Problema com ponteiros c++

Recommended Posts

Estou com um problema no meu código, quando eu cadastro várias pessoas ele não mostra alguns dados. Ex.: o campo código fica em branco, ou outro campo qualquer.

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

using namespace std;

class pessoa{

private:
    char nome[30],email[50],telefone[10],rg[10],codigo[10];

public:
    void cadastrar(int i);
    void consultar(int i);
};

pessoa* p;

void pessoa :: cadastrar(int i){
    cout << "Digite o Codigo: ";
    cin >> p[i].codigo;

    cout << "Digite o Nome: ";
    cin >> p[i].nome;

    cout << "Digite o Email: ";
    cin >> p[i].email;

    cout << "Digite o Telefone: ";
    cin >> p[i].telefone;

    cout << "Digite o RG: ";
    cin >> p[i].rg;
};

void pessoa :: consultar(int i){
    cout << "Codigo: " << p[i].codigo;

    cout << " Nome: " << p[i].nome;

    cout << " Email: " << p[i].email;

    cout << " Telefone: " << p[i].telefone;

    cout << " RG: " << p[i].rg << endl;
};

int main(){

   int y=0,opc,new_opc;
   p = new pessoa[y];

do{

    cout << "\n----- MENU -----" << endl;
    cout << "1- Cadastrar" << endl;
    cout << "2- Consultar" << endl;
    cout << "3- Alterar" << endl;
    cout << "0- Sair" << endl;
    cout << "----------------" << endl;
    cout << "Informe a Opcao: ";
    cin >> opc;

    switch (opc){
        case 1:
            system("cls");
            do{
                p[y].cadastrar(y);
                new_opc=0;
                cout << "Deseja continuar cadastrando? 1-Sim / 2-Nao " << endl;
                cin >> new_opc;
                y++;

	     }while(new_opc==1);
        system("cls");
        break;

        case 2:
            system("cls");
            for(int i=0;i<y;i++){
                p[i].consultar(i);
            }
        break;

        default:
            exit(0);
    }

}while(opc!=0);

    delete[] p;

    return 0;
}

 

Editado por Gabriel Lemos Alves

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include <iostream>
#include <stdlib.h>
#include <stdio.h>

using namespace std;

class pessoa{

private:
    char nome[30],email[50],telefone[10],rg[10],codigo[10];

public:
    void cadastrar();
    void consultar();
};

pessoa **p;//*p[]

void pessoa :: cadastrar(){
    cout << "Digite o Codigo: ";
    cin >> codigo;

    cout << "Digite o Nome: ";
    cin >> nome;

    cout << "Digite o Email: ";
    cin >> email;

    cout << "Digite o Telefone: ";
    cin >> telefone;

    cout << "Digite o RG: ";
    cin >> rg;
};

void pessoa :: consultar(){
    cout << "Codigo: " << codigo;

    cout << " Nome: " << nome;

    cout << " Email: " << email;

    cout << " Telefone: " << telefone;

    cout << " RG: " << rg << endl;
};

int main(){

   int y=0,opc,new_opc;
   p = (pessoa **)malloc(sizeof(pessoa**));

do{

    cout << "\n----- MENU -----" << endl;
    cout << "1- Cadastrar" << endl;
    cout << "2- Consultar" << endl;
    cout << "3- Alterar" << endl;
    cout << "0- Sair" << endl;
    cout << "----------------" << endl;
    cout << "Informe a Opcao: ";
    cin >> opc;

    switch (opc){
        case 1:
            system("cls");
            do{
                p[y] = new pessoa;
                p[y]->cadastrar();
                new_opc=0;
                cout << "Deseja continuar cadastrando? 1-Sim / 2-Nao " << endl;
                cin >> new_opc;
                y++;

	     }while(new_opc==1);
        system("cls");
        break;

        case 2:
            system("cls");
            for(int i=0;i<y;i++){
                p[i]->consultar();
            }
        break;

        default:
            exit(0);
    }

}while(opc!=0);

    delete[] p;

    return 0;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tentei as duas ajudas mas não deu certo, ele mostra todos os campos certinho menos o código .... :confused:

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include <iostream>
#include <stdlib.h>
#include <stdio.h>

using namespace std;

class pessoa{

private:
    char nome[30],email[50],telefone[10],rg[10],codigo[10];

public:
    void cadastrar();
    void consultar();
};

pessoa **p;//*p[]

void pessoa :: cadastrar(){
    cout << "Digite o Codigo: ";
    cin >> codigo;
    cin.sync();

    cout << "Digite o Nome: ";
    cin >> nome;
    cin.sync();

    cout << "Digite o Email: ";
    cin >> email;
    cin.sync();

    cout << "Digite o Telefone: ";
    cin >> telefone;
    cin.sync();

    cout << "Digite o RG: ";
    cin >> rg;
    cin.sync();
};

void pessoa :: consultar(){
    cout << "Codigo: " << codigo;

    cout << " Nome: " << nome;

    cout << " Email: " << email;

    cout << " Telefone: " << telefone;

    cout << " RG: " << rg << endl;
};

int main(){

   int y=0,opc,new_opc;
   p = (pessoa **)malloc(sizeof(pessoa**));

do{

    cout << "\n----- MENU -----" << endl;
    cout << "1- Cadastrar" << endl;
    cout << "2- Consultar" << endl;
    cout << "3- Alterar" << endl;
    cout << "0- Sair" << endl;
    cout << "----------------" << endl;
    cout << "Informe a Opcao: ";
    cin >> opc;
    cin.sync();

    switch (opc){
        case 1:
            system("cls");
            do{
                p[y] = new pessoa;
                p[y]->cadastrar();
                new_opc=0;
                cout << "Deseja continuar cadastrando? 1-Sim / 2-Nao " << endl;
                cin >> new_opc;
                cin.sync();
                y++;

	     }while(new_opc==1);
        system("cls");
        break;

        case 2:
            system("cls");
            for(int i=0;i<y;i++){
                p[i]->consultar();
            }
        break;

        default:
            exit(0);
    }

}while(opc!=0);

    delete[] p;

    return 0;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois o programa sim funciona ok aqui:
 

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

using namespace std;

class pessoa {

private:
    char nome[30], email[50], telefone[10], rg[10], codigo[10];
    
public:
    void cadastrar();
    void consultar();
};

pessoa **p;

void pessoa :: cadastrar() {
    cout << "Digite o Codigo: ";
    cin >> codigo;
    cin.sync();
    
    cout << "Digite o Nome: ";
    cin >> nome;
    cin.sync();
    
    cout << "Digite o Email: ";
    cin >> email;
    cin.sync();
    
    cout << "Digite o Telefone: ";
    cin >> telefone;
    cin.sync();
    
    cout << "Digite o RG: ";
    cin >> rg;
    cin.sync();
};

void pessoa :: consultar() {
    cout << "Codigo: " << codigo << endl;
    
    cout << " Nome: " << nome << endl;
    
    cout << " Email: " << email << endl;
    
    cout << " Telefone: " << telefone << endl;
    
    cout << " RG: " << rg << endl << endl;
};

int main() {
    const int TAM = 100;
    int y = 0, opc, new_opc;
    p = new pessoa*[TAM];
    
    
    do {
    
        cout << "\n----- MENU -----" << endl;
        cout << "1- Cadastrar" << endl;
        cout << "2- Consultar" << endl;
        cout << "3- Alterar" << endl;
        cout << "0- Sair" << endl;
        cout << "----------------" << endl;
        cout << "Informe a Opcao: ";
        cin >> opc;
        cin.sync();
        
        switch ( opc ) {
            case 1:
                system ( "cls" );
                
                do {
                    p[y] = new pessoa;
                    p[y]->cadastrar();
                    new_opc = 0;
                    cout << "Deseja continuar cadastrando? 1-Sim / 2-Nao " << endl;
                    cin >> new_opc;
                    cin.sync();
                    y++;
                    
                } while ( new_opc == 1 && y < TAM );
                
                system ( "cls" );
                break;
                
            case 2:
                system ( "cls" );
                
                for ( int i = 0; i < y; i++ ) {
                    p[i]->consultar();
                }
                
                break;
                
            default:
                exit ( 0 );
        }
        
    } while ( opc != 0 );
    
    delete[] p;
    
    return 0;
}

prove este

adicionado 6 minutos depois

certamente para liberar tem erro
 pois **p é como uma matriz, deveria liberar cada umas das posições de p[] primeiro para ultimo liberar o ponteiro.

for( int i = 0; i<tam; i++ )
delete[] p;

E depois.
delete p;

 

Essa seria a forma correta de liberar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aqui continua não mostrando o código só pode ser aqui o problema então ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se eu digitar coisas aleatorias ele funciona certinho, mas quando cadastro coisas validas da esse bug.

Sem título.png

Compartilhar este post


Link para o post
Compartilhar em outros sites

não entendo o que você diz.

Citação

Se eu digitar coisas aleatorias ele funciona certinho, mas quando cadastro coisas validas da esse bug


Como assim :atirador:

 

Explique melhor seus passos de prova. Passo a passo hein :exorcize:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por exemplo: 

Codigo: 1

Nome: 1

Email: 1

Tel: 1

Rg:1 

// Mostra tudo certo

 

Codigo: 1

Nome: Joao

Email: joao_123@hotmail.com

Tel: 32323232
Rg: 1234567890

 

// Nao mostra o codigo

adicionado 35 minutos depois

Agora deu certo kkk aumentei pra [11] o vetor do RG e funcionou -.-'

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora funcionou essa macumba kkk . Valeu pela ajuda

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caso queira usar menos memória:

#include <string.h>

class pessoa {

private:
    char *nome, *email, *telefone, *rg, *codigo;//Nao alocado
    
public:
    void cadastrar();
    void consultar();
};

pessoa **p;

//Aloca/copia string
char* novastr(char *string,char *destino){
    destino = new char[strlen(string)];
    strcpy(destino,string);
    return destino;
}

void pessoa :: cadastrar() {
	char *buffer = new char[512]; 
	
	
    cout << "Digite o Codigo: ";
    cin.getline(buffer,512);
    codigo = novastr(buffer,codigo);//obter codigo de buffer
    
    cout << "Digite o Nome: ";
    cin.getline(buffer,512);
    nome = novastr(buffer,nome);
    
    cout << "Digite o Email: ";
    cin.getline(buffer,512);
    email = novastr(buffer,email);
    
    cout << "Digite o Telefone: ";
    cin.getline(buffer,512);
    telefone = novastr(buffer,telefone);
    
    cout << "Digite o RG: ";
    cin.getline(buffer,512);
    rg = novastr(buffer,rg);
    
    free(buffer);
};

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu pela ajuda tambem freak no causo se eu for criar a função alterar, o exercicio pede pra fazer uma busca por nome e verificar se ele existe ou não . Se eu fizer um for pra percorrer o ponteiro e comparar usando a strcmp será que da certo ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Grabriel...

 

Recomendo não usar char[] para guardar os valores e sim strings, com strings esses erros de memória não serão problemas, outro fato é que você já está usando c++.

Se você usar string poderá usar o método Compare() da própria biblioteca string.

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×