Ir ao conteúdo
  • Cadastre-se

Oi, preciso de uma ajudinha!


Marcia22

Posts recomendados

Olá! Sou nova por aqui. Estou tentando fazer um pequeno cadastro em C utilizando struct e ponteiros. Acontece que minha função listagem está retornando (null) mesmo depois de ter cadastrado um nome. Alguém pode me ajudar? Segue o código abaixo:

#include<stdio.h>
#include<conio.h>

struct cadastro /* cria a estrutura cadastro e define suas variaveis */
{
char nome[30];
char cargo[20];
char sexo;
char cidade [30];
char estado [2];
int codigo;
int telefone;
int cpf;
int idade;
int salario;
};

struct cadastro cad; /*cria a variavel cad do tipo estrutura
com todos os campos definidos em cadastro */
struct cadastro *p; /*cria um ponteiro para a estrutura*/

void listagem(struct cadastro *p)
{
printf("Nome:%s", p -> nome);
getch();
}

void inclusao(void)
{
printf("Digite o nome completo: ");
fflush(stdin);
gets(p -> nome);
listagem(p);
}

void exclusao(void)
{
printf("EXCLUSAO.");
getch();
}

void alteracao(void)
{
printf("ALTERACAO.");
getch();
}

void main()

{

struct cadastro cad; /*cria a variavel cad do tipo estrutura
com todos os campos definidos em cadastro */
struct cadastro* p;
int opcao;
p=&cad; //inicializando o ponteiro p com o endereco de cad
clrscr();
printf("CADASTRO");
printf("============================\n\n");
printf("\t\t 1 INCLUSAO\n\t\t 2 EXCLUSAO\n\t\t 3 ALTERAR\n\t\t 4 LISTAGEM\n\t\t 5 SAIR\n\n");

do
{
printf("Qual a sua opcao? ");
scanf("%d", &opcao);

switch(opcao)
{
case 1: inclusao();
break;
case 2: exclusao();
break;
case 3: alteracao();
break;
case 4: listagem(p);
break;

}
}
while ((opcao < 1) || (opcao > 4));
}

Link para o comentário
Compartilhar em outros sites

Olá, Marcia22.

Olá! Sou nova por aqui. Estou tentando fazer um pequeno cadastro em C utilizando struct e ponteiros. Acontece que minha função listagem está retornando (null) mesmo depois de ter cadastrado um nome. Alguém pode me ajudar? Segue o código abaixo:

#include<stdio.h>
#include<conio.h>

struct cadastro /* cria a estrutura cadastro e define suas variaveis */
{
char nome[30];
char cargo[20];
char sexo;
char cidade [30];
char estado [2];
int codigo;
int telefone;
int cpf;
int idade;
int salario;
};

struct cadastro cad; /*cria a variavel cad do tipo estrutura
com todos os campos definidos em cadastro */
struct cadastro *p; /*cria um ponteiro para a estrutura*/

void listagem(struct cadastro *p)
{
printf("Nome:%s", p -> nome);
getch();
}

void inclusao(void)
{
printf("Digite o nome completo: ");
fflush(stdin);
gets(p -> nome);
listagem(p);
}

void exclusao(void)
{
printf("EXCLUSAO.");
getch();
}

void alteracao(void)
{
printf("ALTERACAO.");
getch();
}

void main()

{
int opcao;
p=&cad; //inicializando o ponteiro p com o endereco de cad
clrscr();
printf("CADASTRO");
printf("============================\n\n");
printf("\t\t 1 INCLUSAO\n\t\t 2 EXCLUSAO\n\t\t 3 ALTERAR\n\t\t 4 LISTAGEM\n\t\t 5 SAIR\n\n");

do
{
printf("Qual a sua opcao? ");
scanf("%d", &opcao);

switch(opcao)
{
case 1: inclusao();
break;
case 2: exclusao();
break;
case 3: alteracao();
break;
case 4: listagem(p);
break;

}
}
while ((opcao < 1) || (opcao > 4));
}

Pode não ser isso, mas, uma vez que você criou as variáveis globais CAD e *P, se você criá-las novamente como locais de main, o programa vai dar preferência pela local. Quando você chama a função INCLUSAO, p. ex., ele utiliza a global, que não foi inicializada.

Experimente remover as locais de main e compilar novamente.

Eu já removí no código acima.

[]'s

Link para o comentário
Compartilhar em outros sites

Estou continuando o cadastro e quero fazer várias fichas com todos os campos que eu tenho. No caso, acho que seria só criar assim: struct cadastro cad[15];

Minha dúvida é, como faço para acessar cada campo de cada cadastro?

Tentei algo como gets(p[0] -> nome); Mas isso não é possível. Como devo acessar? O código atualizado segue abaixo:

#include<stdio.h>
#include<conio.h>

struct cadastro /* cria a estrutura cadastro e define suas variaveis */
{
char nome[30];
char cargo[20];
char sexo;
char cidade [30];
char estado [2];
int codigo;
int telefone;
int cpf;
int idade;
int salario;
};

struct cadastro cad; /* cria a variavel global cad do tipo estrutura
com todos os campos definidos em cadastro */

struct cadastro *p=&cad; /*cria um ponteiro para a estrutura e inicializa
com o endereco de cad*/

void listagem(struct cadastro *p)
{
printf("Nome:%s", p -> nome);
printf("\nPressione ENTER para continuar");
getch();
main();
}

void inclusao(void)
{
printf("Digite o nome completo: ");
fflush(stdin);
gets(p -> nome);
printf("Nome cadastrado com sucesso, pressione ENTER para continuar.");
getch();
main();
}

void exclusao(void)
{
printf("EXCLUSAO.");
getch();
}

void alteracao(void)
{
printf("ALTERACAO.");
getch();
}

void menu(int opcao)
{
switch(opcao)
{
case 1: inclusao();
break;
case 2: exclusao();
break;
case 3: alteracao();
break;
case 4: listagem(p);
break;
}
}

main()
{
int opcao;
clrscr();
printf("CADASTRO\n");
printf("============================\n\n");
printf("\t\t 1 INCLUSAO\n\t\t 2 EXCLUSAO\n\t\t 3 ALTERAR\n\t\t 4 LISTAGEM\n\t\t 5 SAIR\n\n");
do
{
printf("Qual a sua opcao? ");
scanf("%d", &opcao);
if ((opcao < 1) || (opcao > 5))
{
printf("Opcao invalida. ");
}
else
{
menu(opcao);
}
}
while ((opcao < 1) || (opcao > 5));
return 0;
}

Link para o comentário
Compartilhar em outros sites

Olá, Marcia22.

Tente capturar a string usando GETS e passando o endereço da string para a função, o código está abaixo.


#include<conio.h>

struct cadastro /* cria a estrutura cadastro e define suas variaveis */
{
char nome[30];
char cargo[20];
char sexo;
char cidade [30];
char estado [2];
int codigo;
int telefone;
int cpf;
int idade;
int salario;
};

struct cadastro cad; /* cria a variavel global cad do tipo estrutura
com todos os campos definidos em cadastro */

struct cadastro *p=&cad; /*cria um ponteiro para a estrutura e inicializa
com o endereco de cad*/

void listagem(struct cadastro *p)
{
printf("Nome:%s", p -> nome);
printf("\nPressione ENTER para continuar");
getch();
}

void inclusao(void)
{
printf("Digite o nome completo: ");
fflush(stdin);
gets(&p -> nome);
printf("Nome cadastrado com sucesso, pressione ENTER para continuar.");
getch();
}

void exclusao(void)
{
printf("EXCLUSAO.");
getch();
}

void alteracao(void)
{
printf("ALTERACAO.");
getch();
}

void menu(int opcao)
{
switch(opcao)
{
case 1: inclusao();
break;
case 2: exclusao();
break;
case 3: alteracao();
break;
case 4: listagem(p);
break;
}
}

main()
{
int opcao;
clrscr();
printf("CADASTRO\n");
printf("============================\n\n");
printf("\t\t 1 INCLUSAO\n\t\t 2 EXCLUSAO\n\t\t 3 ALTERAR\n\t\t 4 LISTAGEM\n\t\t 5 SAIR\n\n");
do
{
printf("Qual a sua opcao? ");
scanf("%d", &opcao);
if ((opcao < 1) || (opcao > 5))
{
printf("Opcao invalida. ");
}
else
{
menu(opcao);
}
}
while ((opcao < 1) || (opcao > 5));
return 0;
}
#include<stdio.h>

Se não funcionar, experimente com SCANF, conforme esse código:


#include<conio.h>
#include <string.h>

struct cadastro /* cria a estrutura cadastro e define suas variaveis */
{
char nome[30];
char cargo[20];
char sexo;
char cidade [30];
char estado [2];
int codigo;
int telefone;
int cpf;
int idade;
int salario;
};

struct cadastro cad; /* cria a variavel global cad do tipo estrutura
com todos os campos definidos em cadastro */

struct cadastro *p=&cad; /*cria um ponteiro para a estrutura e inicializa
com o endereco de cad*/

char string_aux[30];

void listagem(struct cadastro *p)
{
printf("Nome:%s", p -> nome);
printf("\nPressione ENTER para continuar");
getch();
}

void inclusao(void)
{
printf("Digite o nome completo: ");
fflush(stdin);
scanf("%s",string_aux);
strcpy(&p -> nome, string_aux);
printf("Nome cadastrado com sucesso, pressione ENTER para continuar.");
getch();
}

void exclusao(void)
{
printf("EXCLUSAO.");
getch();
}

void alteracao(void)
{
printf("ALTERACAO.");
getch();
}

void menu(int opcao)
{
switch(opcao)
{
case 1: inclusao();
break;
case 2: exclusao();
break;
case 3: alteracao();
break;
case 4: listagem(p);
break;
}
}

main()
{
int opcao;
clrscr();
printf("CADASTRO\n");
printf("============================\n\n");
printf("\t\t 1 INCLUSAO\n\t\t 2 EXCLUSAO\n\t\t 3 ALTERAR\n\t\t 4 LISTAGEM\n\t\t 5 SAIR\n\n");
do
{
printf("Qual a sua opcao? ");
scanf("%d", &opcao);
if ((opcao < 1) || (opcao > 5))
{
printf("Opcao invalida. ");
}
else
{
menu(opcao);
}
}
while ((opcao < 1) || (opcao > 5));
return 0;
}
#include<stdio.h>

Eu não testei. Dá uma experimentada. E comente os resultados.

[]'s

Link para o comentário
Compartilhar em outros sites

Maurício, não funcionou... Acho que não expliquei bem o que quero fazer. Quero criar várias estruturas cadastro, como se fossem várias fichas de várias pessoas. Acredito que posso criar assim: struct cadastro cad[20]; por exemp. Porém como faço para gravar os dados da primeira pessoa? cad[0] e da segund a? cad[1] ?terceira... e depois listar todos os dados de todas as pessoas?

Outra coisa, notei que você retirou minha chamda a função main() nas minhas funções listagem e inclusao. Não devo fazer isso? Fiz para construir o menu novamente.

Muito obrigada pela ajuda Maurício!

bjs,

Marcia.

Link para o comentário
Compartilhar em outros sites

Maurício, não funcionou... Acho que não expliquei bem o que quero fazer. Quero criar várias estruturas cadastro, como se fossem várias fichas de várias pessoas. Acredito que posso criar assim: struct cadastro cad[20]; por exemp. Porém como faço para gravar os dados da primeira pessoa? cad[0] e da segund a? cad[1] ?terceira... e depois listar todos os dados de todas as pessoas?

Outra coisa, notei que você retirou minha chamda a função main() nas minhas funções listagem e inclusao. Não devo fazer isso? Fiz para construir o menu novamente.

Muito obrigada pela ajuda Maurício!

bjs,

Marcia.

Olá, Márcia.

Sim. O procedimento é este mesmo.

O parâmetro de entrada da função GETS, é um ponteiro de char, ou, uma string.

Experimente fazer a chamada com:

gets ( &p.nome );    // passa o endereço da string NOME

E o procedimento para acessar um registro dentro de um vetor, é o mesmo que o usado para acessar os campos individualmente, só que agora, você indica a FICHA que você quer acessar.

p[0] -> codigo = 100;
p[12] -> telefone = 1234;

E assim por diante.

Em C, strings não podem ser atribuídas diretamente. você precisa igualar, elemento por elemento, ou então, usar funções de manipulação de strings, incluídas no header <STRING.H>

Aí, você pode acessar assim:

#include <string.h>

char string_aux [ 50 ];

strcpy ( &p[5].nome, "MARCIA");
strcpy ( string_aux, p[5]->nome );

Se não funcionar o de cima, este deve funcionar:

#include <string.h>

char string_aux [ 50 ];

strcpy ( &p[5].nome, "MARCIA");
strcpy ( string_aux, &p[5].nome );

E pra exibir, você usa o printf:

printf ("%s", p[5]->nome);
ou
printf ("%s", &p[5].nome);

Espero que ajude.

[]'s

Link para o comentário
Compartilhar em outros sites

Oi, Márcia.

Esse código aqui tá funcionando. Só CLRSCR que no DEVC++ não funciona. Eu não sei qual o comando no DEV, para limpar a tela.

Eu só experimentei as opções de inclusão e listagem.

[]'s


#include<conio.h>
#include <string.h>

struct cadastro /* cria a estrutura cadastro e define suas variaveis */
{
char nome[30];
char cargo[20];
char sexo;
char cidade [30];
char estado [2];
int codigo;
int telefone;
int cpf;
int idade;
int salario;
};

struct cadastro cad; /* cria a variavel global cad do tipo estrutura
com todos os campos definidos em cadastro */

struct cadastro *p=&cad; /*cria um ponteiro para a estrutura e inicializa
com o endereco de cad*/

void listagem(struct cadastro *p)
{
printf("Nome:%s", p -> nome);
printf("\nPressione ENTER para continuar");
getch();
}

void inclusao(void)
{
char string_aux [ 30 ];

printf("Digite o nome completo: ");
fflush(stdin);
gets( string_aux );
strcpy ( p->nome, string_aux );
printf("Nome cadastrado com sucesso, pressione ENTER para continuar.");
getch();
}

void exclusao(void)
{
printf("EXCLUSAO.");
getch();
}

void alteracao(void)
{
printf("ALTERACAO.");
getch();
}

void menu(int opcao)
{
switch(opcao)
{
case 1: inclusao();
break;

case 2: exclusao();
break;

case 3: alteracao();
break;

case 4: listagem(p);
break;
}
}

main()
{
int opcao;
// clrscr();
printf("CADASTRO\n");
printf("============================\n\n");
printf("\t\t 1 INCLUSAO\n\t\t 2 EXCLUSAO\n\t\t 3 ALTERAR\n\t\t 4 LISTAGEM\n\t\t 5 SAIR\n\n");
do
{
printf("Qual a sua opcao? ");
scanf("%d", &opcao);
if ((opcao < 1) || (opcao > 5))
{
printf("Opcao invalida. ");
}
else
{
menu(opcao);
}
}
while ((opcao >= 1) && (opcao < 5));
return 0;
}

#include<stdio.h>

Link para o comentário
Compartilhar em outros sites

Oi, Márcia.

Esse código aqui tá funcionando. Só CLRSCR que no DEVC++ não funciona. Eu não sei qual o comando no DEV, para limpar a tela.

Eu só experimentei as opções de inclusão e listagem.

[]'s


#include<conio.h>
#include <string.h>

struct cadastro /* cria a estrutura cadastro e define suas variaveis */
{
char nome[30];
char cargo[20];
char sexo;
char cidade [30];
char estado [2];
int codigo;
int telefone;
int cpf;
int idade;
int salario;
};

struct cadastro cad; /* cria a variavel global cad do tipo estrutura
com todos os campos definidos em cadastro */

struct cadastro *p=&cad; /*cria um ponteiro para a estrutura e inicializa
com o endereco de cad*/

void listagem(struct cadastro *p)
{
printf("Nome:%s", p -> nome);
printf("\nPressione ENTER para continuar");
getch();
}

void inclusao(void)
{
char string_aux [ 30 ];

printf("Digite o nome completo: ");
fflush(stdin);
gets( string_aux );
strcpy ( p->nome, string_aux );
printf("Nome cadastrado com sucesso, pressione ENTER para continuar.");
getch();
}

void exclusao(void)
{
printf("EXCLUSAO.");
getch();
}

void alteracao(void)
{
printf("ALTERACAO.");
getch();
}

void menu(int opcao)
{
switch(opcao)
{
case 1: inclusao();
break;

case 2: exclusao();
break;

case 3: alteracao();
break;

case 4: listagem(p);
break;
}
}

main()
{
int opcao;
// clrscr();
printf("CADASTRO\n");
printf("============================\n\n");
printf("\t\t 1 INCLUSAO\n\t\t 2 EXCLUSAO\n\t\t 3 ALTERAR\n\t\t 4 LISTAGEM\n\t\t 5 SAIR\n\n");
do
{
printf("Qual a sua opcao? ");
scanf("%d", &opcao);
if ((opcao < 1) || (opcao > 5))
{
printf("Opcao invalida. ");
}
else
{
menu(opcao);
}
}
while ((opcao >= 1) && (opcao < 5));
return 0;
}

#include<stdio.h>

o comando para limpar a tela no dev é system ("cls");

Link para o comentário
Compartilhar em outros sites

Olá rapazes!

Estou continuando meu pequeno cadastro, agora estou tentando gravar em um arquivo, porém não estou conseguindo. Por mais que eu cadastre, meu arquivo dados.dat está sempre em branco. Segue o código abaixo. As outras funções, listagem, alterar etc, podem ignorar pois não alterei ainda. Só a inclusão que deveria estar funcionando mesmo rss.

Ah um detalhe, se forem rodar o programa, criem a pasta c:\temp1 ou alterem no código.

Agradeço desde já.

Marcia

#include<stdio.h>
#include<conio.h>

struct cadastro /* cria a estrutura cadastro e define suas variaveis */
{
char excluido;
char nome[30];
char cargo[20];
char sexo;
char cidade [30];
char estado [2];
int codigo;
int telefone;
int cpf;
int idade;
int salario;
};

struct cadastro cad; /* cria a variavel global cad do tipo estrutura
com todos os campos definidos em cadastro */

FILE *arqvDados = 0;

void listagem(struct cadastro* p)
{
printf("Nome:%s", p -> nome);
printf("\nPressione ENTER para continuar");
getch();
main();
}

void inclusao(struct cadastro cad )
{
char sbuffer[50];
printf("Digite o nome completo: ");
fflush(stdin);
gets(cad.nome);
/*Posicionar no final: */
fseek( arqvDados, 0, SEEK_END ); /*(nome do ponteiro do arquivo, numero de bytes q

vai caminhar, vai para

o final)*/
/*gravar um registro:*/
fwrite( &cad, sizeof( struct cadastro ), 1, arqvDados ); /* &cad grava no endereco

de cad */
printf("Nome cadastrado com sucesso, pressione ENTER para continuar.");
getch();
main();
}

void exclusao(void)
{
printf("EXCLUSAO.");
getch();
}

void alteracao(void)
{
printf("ALTERACAO.");
getch();
}

void menu(int opcao, struct cadastro cad)
{

switch(opcao)
{
case 1: inclusao(cad);
break;
case 2: exclusao();
break;
case 3: alteracao();
break;
// case 4: listagem(p);
// break;

}
}

main()
{

FILE *arqvDados = 0; //variavel ponteiro de arquivo
int opcao;
struct cadastro* p;
arqvDados = fopen( "c:\\temp1\\dados.dat", "rb+" ); /* "rb+" Abre um arquivo binário

para leitura e gravação. O

arquivo deve existir e pode ser atualizado.*/

if( arqvDados == 0 )
{
arqvDados = fopen( "c:\\temp1\\dados.dat", "wb+" ); /* "wb+" Abrir um arquivo

binário para leitura e

gravação. Se o arquivo existir ele será
destruído e reinicializado.

Se não existir será

criado. */
}

if ( arqvDados == 0 )
{
printf("Ocorreu um erro o arquivo nao pode ser aberto\n Tecle ENTER para sair");
getch();
exit(1);
}

p = &cad;
clrscr();
printf("CADASTRO\n");
printf("============================\n\n");
printf("\t\t 1 INCLUSAO\n\t\t 2 EXCLUSAO\n\t\t 3 ALTERAR\n\t\t 4 LISTAGEM\n\t\t 5

SAIR\n\n");
do
{
printf("Qual a sua opcao? ");
scanf("%d", &opcao);
if ((opcao < 1) || (opcao > 5))
{
printf("Opcao invalida. ");
}
else
{
menu(opcao,cad);
}
}
while ((opcao < 1) || (opcao > 5));
return 0;
}

Link para o comentário
Compartilhar em outros sites

Oi, Márcia. Tudo em ordem?

Não conheço operações de disco em C, portanto, agora, só posso dar uns pitacos e ficar observando, eheheheheheh

Mas antes de sair de fato, você cometeu o mesmo erro novamente. Declarou variáveis globais e locais com o mesmo nome. Nesse caso, o compilador vai dar atenção para as locais.

Talvez possa ser isso. Experimente.

É a variável: FILE *arqvDados = 0; declarada na função MAIN.

[]'s

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

Arquivado

Este tópico foi arquivado e está fechado para 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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!