Função para Exibir um Contato
Parte da seção Lógica e Fluxo do Journey de C da Coddy. Lição 53 de 63.
Desafio
FácilCom base no sistema de gerenciamento de contatos das lições anteriores, crie uma função que exiba as informações de contato de forma formatada. Esta lição apresenta três novas funções de string que você precisará: fgets(), strcspn() e strchr(): cada uma é explicada abaixo, antes dos requisitos.
Novas funções usadas nesta lição:
fgets(buffer, size, stdin): lê uma linha de entrada, incluindo espaços (diferentemente descanf, que para ao encontrar um espaço em branco). Armazena a entrada embuffer, lendo no máximosize - 1caracteres. Também armazena o caractere de nova linha'\n'no final.strcspn(str, "\n"): retorna o índice da primeira ocorrência de'\n'emstr. Usada para remover a nova linha final deixada porfgets:str[strcspn(str, "\n")] = '\0';strchr(str, ch): procura o caracterechemstre retorna um ponteiro para sua localização, ouNULLse não for encontrado.
Seu programa deve:
- Usar a mesma definição de struct
Contactdas lições anteriores, 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
- Usar a mesma função
createContactdas lições anteriores, que:- Aloca memória dinamicamente para uma struct
Contact - Inicializa todos os membros com valores padrão
- Retorna um ponteiro para o contato
- Aloca memória dinamicamente para uma struct
- Escrever uma função
populateContactque:- Recebe um ponteiro para uma struct
Contactcomo parâmetro - Usa
fgets()para ler cada campo de string (name, phone, email), de modo que nomes com espaços sejam aceitos - Usa
strcspn()para remover a nova linha final de cada campo de string depois de lê-lo - Usa
scanf("%d", ...)para ler o campo inteiro age - Antes de ler cada campo, exibe exatamente o prompt correspondente, sem nova linha depois dele:
Enter name:,Enter phone:,Enter email:,Enter age:(assim,=== CONTACT DETAILS ===aparece na mesma linha, depois deEnter age:) - Observação: Esta versão de
populateContactnão inclui validação do tamanho do número de telefone: não a adicione, pois as entradas de teste usam números de telefone curtos, como555-1234
- Recebe um ponteiro para uma struct
- Escrever uma função chamada
displayContactque:- Recebe um ponteiro constante para uma struct
Contactcomo parâmetro:const struct Contact *contactPtr - Não retorna nada (void)
- Exibe as informações de contato exatamente neste formato:
=== CONTACT DETAILS ===Name: [name]Phone: [phone]Email: [email]Age: [age] years old========================
- Depois de exibir as informações básicas, calcula e exibe detalhes adicionais:
- Calcula o tamanho do nome usando
strlen()e exibe:Name length: [length] characters - Determina a categoria geracional com base na idade e exibe:
- Se a idade estiver entre 0 e 12:
Generation: Child - Se a idade estiver entre 13 e 19:
Generation: Teenager - Se a idade estiver entre 20 e 39:
Generation: Young Adult - Se a idade estiver entre 40 e 59:
Generation: Middle-aged Adult - Se a idade for 60 ou mais:
Generation: Senior
- Se a idade estiver entre 0 e 12:
- Verifica se o email contém o caractere
'@'usandostrchr()e exibe:- Se
'@'for encontrado:Email format: Valid - Se
'@'não for encontrado:Email format: Invalid
- Se
- Calcula o tamanho do nome usando
- Recebe um ponteiro constante para uma struct
- Na função main:
- Crie um contato usando a função
createContact - Verifique se a criação do contato foi bem-sucedida
- Chame a função
populateContactpara preencher os dados do contato - Chame a função
displayContactpara exibir as informações de contato formatadas - Libere a memória alocada dinamicamente
- Exiba
Program completed successfully
- Crie um contato usando a função
Este desafio demonstra como criar uma função de exibição que recebe um ponteiro constante para uma struct, garantindo que a função não possa modificar os dados originais. Você praticará o uso de fgets() para ler strings que contêm espaços, de strcspn() para remover novas linhas finais, do operador seta para acessar membros de uma struct por meio de um ponteiro, de strchr() para pesquisar caracteres e de lógica condicional para categorizar dados. O uso de const na declaração do parâmetro é uma boa prática que impede a modificação acidental dos dados de contato dentro da função de exibição.
Experimente você mesmo
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char name[50];
char phone[20];
char email[40];
int age;
} Contact;
Contact* createContact() {
Contact* contact = (Contact*)malloc(sizeof(Contact));
if (contact == NULL) {
return NULL;
}
strcpy(contact->name, "");
strcpy(contact->phone, "");
strcpy(contact->email, "");
contact->age = 0;
return contact;
}
void populateContact(Contact* contactPtr) {
printf("Enter name: ");
scanf("%s", contactPtr->name);
printf("Enter phone: ");
scanf("%s", contactPtr->phone);
printf("Enter email: ");
scanf("%s", contactPtr->email);
printf("Enter age: ");
scanf("%d", &contactPtr->age);
if (contactPtr->age < 0 || contactPtr->age > 120) {
printf("Invalid age entered\n");
} else if (strlen(contactPtr->phone) < 10) {
printf("Invalid phone number\n");
} else {
printf("Contact populated successfully\n");
}
}
int main() {
Contact* contact = createContact();
if (contact == NULL) {
return 1;
}
populateContact(contact);
printf("Contact Information:\n");
printf("Name: %s\n", contact->name);
printf("Phone: %s\n", contact->phone);
printf("Email: %s\n", contact->email);
printf("Age: %d\n", contact->age);
free(contact);
printf("Contact deleted successfully\n");
return 0;
}Todas as lições de Lógica e Fluxo
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 ContatoPratique por conta própria: Compilador de C online