Função para Criar um Contato
Parte da seção Logic & Flow do Journey de C da Coddy — lição 51 de 63.
Desafio
FácilCom base na sua struct Contact da lição anterior, crie uma função que aloque dinamicamente memória para um novo contato. Seu programa deve:
- Usar a mesma definição da struct
Contactda lição anterior com os membros:- Um array de caracteres
namecom tamanho 50 - Um array de caracteres
phonecom tamanho 20 - Um array de caracteres
emailcom tamanho 40 - Um inteiro
age
- Um array de caracteres
- Escrever uma função chamada
createContactque:- Não recebe parâmetros
- Retorna um ponteiro para uma struct
Contact - Usa
malloc()para alocar dinamicamente memória para uma structContact - Verifica se a alocação de memória foi bem-sucedida:
- Se a alocação falhar (retornar NULL), imprime
Memory allocation failede retorna NULL - Se a alocação for bem-sucedida, imprime
Contact created successfully
- Se a alocação falhar (retornar NULL), imprime
- Inicializa todos os membros da struct com valores padrão usando o operador de seta:
- Define
namecomo uma string vazia usandocontactPtr->name[0] = '\0'; - Define
phonecomo uma string vazia usandocontactPtr->phone[0] = '\0'; - Define
emailcomo uma string vazia usandocontactPtr->email[0] = '\0'; - Define
agecomo 0 usandocontactPtr->age = 0;
- Define
- Retorna o ponteiro para o contato recém-criado
- Na função main:
- Declarar um ponteiro para uma struct
ContactchamadonewContact - Chamar a função
createContacte atribuir o ponteiro retornado anewContact - Verificar se a criação do contato foi bem-sucedida:
- Se
newContactfor NULL, imprimirFailed to create contacte encerrar o programa - Se for bem-sucedido, imprimir
Contact initialized with default values
- Se
- Exibir as informações do contato inicializado usando o operador de seta neste formato exato:
Default Contact Values:Name: [name](estará vazio)Phone: [phone](estará vazio)Email: [email](estará vazio)Age: [age](será 0)
- Liberar a memória alocada dinamicamente usando
free(newContact) - Imprimir
Memory freed successfully
- Declarar um ponteiro para uma struct
Este desafio introduz o conceito de funções de fábrica (factory functions) - funções que criam e retornam ponteiros para structs alocadas dinamicamente. Você praticará alocação dinâmica de memória, verificação de erros adequada, inicialização de structs através de ponteiros e limpeza de memória.
Experimente você mesmo
#include <stdio.h>
#include <string.h>
// TODO: Define the Contact struct here
struct Contact {
char name[50];
char phone[20];
char email[40];
int age;
};
int main() {
// TODO: Create a Contact variable named person
struct Contact person;
// Read input values
scanf("%s", person.name);
scanf("%s", person.phone);
scanf("%s", person.email);
scanf("%d", &person.age);
// TODO: Write your validation and output code below
if (person.age < 0 || person.age > 120) {
printf("Invalid age");
return 0;
}
if (strlen(person.phone) < 10) {
printf("Invalid phone number");
return 0;
}
printf("Contact Information:\n");
printf("Name: %s\n", person.name);
printf("Phone: %s\n", person.phone);
printf("Email: %s\n", person.email);
printf("Age: %d\n", person.age);
printf("Name length: %lu\n", strlen(person.name));
if (person.age >= 0 && person.age <= 17) {
printf("Category: Minor");
} else if (person.age >= 18 && person.age <= 64) {
printf("Category: Adult");
} else {
printf("Category: Senior");
}
return 0;
}Todas as lições de Logic & Flow
1Fundamentos de Ponteiros
O que é um Ponteiro?Declarando PonteirosO Operador de Endereço (&)O Operador de Desreferência (*)Ponteiros NULLRecapitulação: Fundamentos de Ponteiros4Projeto: Utilitário de Texto Simples
Visão Geral do ProjetoContando Caracteres2Ponteiros e Arrays
Nomes de Arrays como PonteirosElementos de Array - PonteirosAritmética de PonteirosComparando PonteirosRecapitulação: Percorrendo Arrays com Ponteiros5Ponteiros e Funções
Passagem por ValorPassando Ponteiros para FunçõesModificando Variáveis via PonteirosUm Exemplo Clássico: SwapPassando Arrays para FunçõesRecapitulação: Ponteiros como Argumentos3Arrays de Caracteres e Strings
Strings como Arrays de charO Terminador NuloEntrada de Strings com scanfUsando strlen()Usando strcpy()Usando strcat()Usando strcmp()Recapitulação: Funções Básicas de Strings6Gerenciamento de Memória
Memória Stack vs. HeapAlocação Dinâmica - malloc()Usando sizeof() para AlocaçãoVerificando Falhas de AlocaçãoLiberando Memória com free()Alocando com calloc()Recapitulação: Array Dinâmico9Projeto: Cadastro Simples de Contatos
Projeto: Definir a Struct de ContatoFunção para Criar um Contato