TransWikia.com

Não estou conseguindo cadastrar o nome de uma pessoas na minha agenda

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

2 Answers

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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP