Stack Overflow em Português Asked by rafael marques on December 14, 2021
Estou fazendo uma agenda bem simples, os números eu consegui castrar porém os nomes das pessoas eu não consegui.
Meu código
#include <stdio.h>
#include <malloc.h>
#define MAX 50
typedef struct
{
int numero[MAX];
char nome[MAX];
int tam;
} AGENDA;
void imprime(AGENDA *L);
void cadastrar(AGENDA *lista);
void inicia(AGENDA *lista);
int main(int argc, char** argv)
{
AGENDA *agenda = (AGENDA*)malloc(sizeof(AGENDA) * MAX);
int op;
do
{
printf("1-adicionar numeron");
printf("2-remover numeron");
printf("3-procurar numeron");
printf("4-Imprimirn");
printf("6-incia-a-agendan");
printf("7-Pararn");
scanf("%d", &op);
switch(op)
{
case 1:
cadastrar(agenda);
break;
case 6:
inicia(agenda);
break;
case 4:
imprime(agenda);
break;
}
}
while(op != 7);
free(agenda);
return 0;
}
void cadastrar(AGENDA *lista)
{
int op;
do
{
printf("Digite o numeron");
scanf("%d", &lista->numero[lista->tam]);
printf("Digite o seu nomen");
scanf(" %[^n]", lista->nome[lista->tam]);
printf("Digite 1 para continuar 2 para pararn");
scanf("%d", &op);
lista->tam++;
}
while(op != 2);
}
void imprime(AGENDA *L)
{
int i;
for(i = 0; i < L->tam; i++)
{
printf("%dn", L->numero[i]);
printf("%sn", L->nome[i]);
}
}
void inicia(AGENDA *lista)
{
lista->tam = 0;
}
Reescrevi o código para mostrar mais ou menos como se faz. Note que ainda tem muito o melhorar nele. Tem erros que podem acontecer facilmente e estão estão sendo verificados, fora outros detalhes, mas assim é como se faz de verdade, mesmo algo simples.
Colocar vários arrays dentro da struct
não faz sentido algum, o que deseja é mais simples e mais viável que isto. Sua struct
de agenda deve ter apenas o tamanho e um ponteiro para a lista de contatos. Isto já é conceitualmente correto e facilita fazer o resto.
Criei uma nova estrutura com a entrada do contato. Se quiser pode chamar de contato, mas não sei se é adequado em um contexto real. Nela terá o número e o nome. O número eu mudei para string porque geralmente é o número do telefone, então o int
não é adequado. Se for outra coisa, aí parece fazer menos sentido ainda deixar a pessoa digitar isto.
Predeterminei que o nome terá 30 caracteres, você pode usar o tamanho que quiser.
Controlei melhor a digitação. Tem falhas em usar o scanf()
assim, mas para um exercício está bom.
Veja que dei um nome melhor para a função que inicializa a agenda, para ficar claro que precisa liberá-la. E criei antes de qualquer forma, até para evitar outro erro. E mudei a inicialização para reinicialização. Tem um erro aí na reinicialização, que de certa forma eu introduzi, veja se consegue identificar e arrumar, assim exercita de verdade.
Se não entender algum ponto faça perguntas específicas.
Fiz outras simplificações e melhoria. Já que quer aprender preste atenção a cada detalhe, até nos espaços. Tinha outros errado que corrigi, fica de exercício identificá-los.
#include <stdio.h>
#include <malloc.h>
#define MAX 50
typedef struct {
char numero[12]; //permite um telefone nacional
char nome[31]; //permite 30 caracteres
} Entrada;
typedef struct {
int tamanho;
Entrada *contatos;
} Agenda;
void cadastrar(Agenda *agenda) {
int op = 1;
do {
printf("Digite o telefonen");
scanf("%11s", agenda->contatos[agenda->tamanho].numero);
printf("Digite o seu nomen");
scanf(" %30[^n]", agenda->contatos[agenda->tamanho].nome);
printf("Digite 1 para continuar 2 para pararn");
scanf("%d", &op);
agenda->tamanho++;
} while (op != 2);
}
void imprime(Agenda agenda) {
for (int i = 0; i < agenda.tamanho; i++) printf("%11s - %sn", agenda.contatos[i].numero, agenda.contatos[i].nome);
}
Agenda iniciaAlocaAgenda() {
return (Agenda) { .tamanho = 0, .contatos = malloc(sizeof(Entrada) * MAX) };
}
void liberaAgenda(Agenda agenda) {
free(agenda.contatos);
}
int main() {
Agenda agenda = iniciaAlocaAgenda();
int op = 1;
do {
printf("1-Adicionar numeron");
printf("2-Remover numeron");
printf("3-Procurar numeron");
printf("4-Imprimirn");
printf("6-Reincia a agendan");
printf("7-Pararn");
scanf("%d", &op);
switch (op) {
case 1:
cadastrar(&agenda);
break;
case 2:
case 3:
break;
case 4:
imprime(agenda);
break;
case 5:
break;
case 6:
agenda = iniciaAlocaAgenda();
break;
}
} while (op != 7);
liberaAgenda(agenda);
}
Veja funcionando no ideone. E no repl.it. Também coloquei no GitHub para referência futura.
Answered by Maniero on December 14, 2021
O erro está em como você estruturou os dados na estrutura. nome
deve ser uma matriz, e não um vetor. Fazendo:
typedef struct
{
int numero[MAX];
char nome[MAX][MAX];
int tam;
} AGENDA;
No seu código atualmente, você está tentando salvar uma string em um char, o que não é possível. Como você quer utilizar várias strings, o que você deve fazer é utilizar uma matriz de caracteres.
Um comentário extra que gostaria de fazer é que, particularmente, eu atacaria o problema de outra forma. Ao invés de fazer o struct guardar todos os contatos, fazer com que cada struct guarde um contato e a partir daí fazer um vetor de Contatos. Logo, a estrutura se tornaria:
typedef struct {
int numero;
char nome[MAX];
} Contato;
Answered by João Pedro Henrique on December 14, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP