Ir ao conteúdo
  • Cadastre-se

Problema com ponteiros c++


Ir à solução Resolvido por vangodp,

Posts recomendados

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;
}

 

Link para o comentário
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;
}

 

Link para o comentário
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;
}

 

Link para o comentário
Compartilhar em outros sites

  • Solução

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.

Link para o comentário
Compartilhar em outros sites

Por exemplo: 

Codigo: 1

Nome: 1

Email: 1

Tel: 1

Rg:1 

// Mostra tudo certo

 

Codigo: 1

Nome: Joao

Email: [email protected]

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 -.-'

Link para o comentário
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);
};

 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!