Menu
Coddy logo textTech

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.

challenge icon

Desafio

Fácil

Com base no seu sistema de gerenciamento de contatos das lições anteriores, crie uma função que exiba as informações de contato de uma forma formatada. Esta lição apresenta três novas funções de string que você precisará usar: 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 de scanf, que para ao encontrar um espaço em branco). Ela armazena a entrada em buffer, lendo no máximo size - 1 caracteres. Ela também armazena o caractere de nova linha '\n' no final.
  • strcspn(str, "\n"): retorna o índice da primeira ocorrência de '\n' em str. Usada para remover a nova linha final deixada por fgets: str[strcspn(str, "\n")] = '\0';
  • strchr(str, ch): procura o caractere ch em str e retorna um ponteiro para sua localização, ou NULL se não for encontrado.

Seu programa deve:

  1. Usar a mesma definição da struct Contact das lições anteriores, com os membros:
    • Um vetor de caracteres name com tamanho 50
    • Um vetor de caracteres phone com tamanho 20
    • Um vetor de caracteres email com tamanho 40
    • Um inteiro age
  2. Usar a mesma função createContact das lições anteriores, que:
    • Aloca dinamicamente memória para uma struct Contact
    • Inicializa todos os membros com valores padrão
    • Retorna um ponteiro para o contato
  3. Escrever uma função populateContact que:
    • Receba um ponteiro para uma struct Contact como parâmetro
    • Use fgets() para ler cada campo de string (name, phone, email), para que nomes com espaços sejam aceitos
    • Use strcspn() para remover a nova linha final de cada campo de string depois de lê-lo
    • Use scanf("%d", ...) para ler o campo inteiro age
    • Observação: Esta versão de populateContact não inclui validação do comprimento do número de telefone: não a adicione, pois as entradas de teste usam números de telefone curtos, como 555-1234
  4. Escrever uma função chamada displayContact que:
    • Receba um ponteiro constante para uma struct Contact como parâmetro: const struct Contact *contactPtr
    • Não retorne nada (void)
    • Imprima as informações de contato neste formato exato:
      • === CONTACT DETAILS ===
      • Name: [name]
      • Phone: [phone]
      • Email: [email]
      • Age: [age] years old
      • ========================
    • Depois de exibir as informações básicas, calcule e exiba detalhes adicionais:
      • Calcule o comprimento do nome usando strlen() e imprima: Name length: [length] characters
      • Determine a categoria geracional com base na idade e imprima:
        • 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
      • Verifique se o e-mail contém o caractere '@' usando strchr() e imprima:
        • Se '@' for encontrado: Email format: Valid
        • Se '@' não for encontrado: Email format: Invalid
  5. Na função principal:
    • Crie um contato usando a função createContact
    • Verifique se a criação do contato foi bem-sucedida
    • Chame a função populateContact para preencher os dados do contato
    • Chame a função displayContact para exibir as informações formatadas do contato
    • Libere a memória alocada dinamicamente
    • Imprima Program completed successfully

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 contenham espaços, strcspn() para remover novas linhas finais, o operador seta para acessar membros de uma struct por meio de um ponteiro, strchr() para pesquisar caracteres e a 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 do 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

Pratique por conta própria: Compilador de C online