Menu
CoddyTech

Функция для вывода контакта

Часть раздела Логика и управление потоком путешествия по C на Coddy. Урок 53 из 63.

challenge icon

Задание

Легко

Продолжая работу над системой управления контактами из предыдущих уроков, создайте функцию, которая выводит контактную информацию в форматированном виде. В этом уроке представлены три новые строковые функции, которые вам понадобятся: fgets(), strcspn() и strchr(): каждая из них объясняется ниже, перед требованиями.

Новые функции, используемые в этом уроке:

  • fgets(buffer, size, stdin): читает строку ввода вместе с пробелами (в отличие от scanf, который прекращает чтение на пробеле). Функция сохраняет ввод в buffer, считывая не более size - 1 символов. В конце она также сохраняет символ новой строки '\n'.
  • strcspn(str, "\n"): возвращает индекс первого вхождения '\n' в str. Используется для удаления завершающего символа новой строки, оставленного fgets: str[strcspn(str, "\n")] = '\0';
  • strchr(str, ch): ищет символ ch в str и возвращает указатель на его позицию или NULL, если символ не найден.

Ваша программа должна:

  1. Использовать то же определение структуры Contact, что и в предыдущих уроках, с полями:
    • Массив символов name размером 50
    • Массив символов phone размером 20
    • Массив символов email размером 40
    • Целое число age
  2. Использовать ту же функцию createContact, что и в предыдущих уроках. Она:
    • Динамически выделяет память для структуры Contact
    • Инициализирует все поля значениями по умолчанию
    • Возвращает указатель на контакт
  3. Написать функцию populateContact, которая:
    • Принимает в качестве параметра указатель на структуру Contact
    • Использует fgets() для чтения каждого строкового поля (имени, телефона, электронной почты), чтобы можно было вводить имена с пробелами
    • Использует strcspn(), чтобы удалять завершающий символ новой строки из каждого строкового поля после чтения
    • Использует scanf("%d", ...) для чтения целочисленного поля возраста
    • Перед чтением каждого поля выводит соответствующее приглашение точно в указанном виде, без символа новой строки после него: Enter name: , Enter phone: , Enter email: , Enter age: (таким образом, === CONTACT DETAILS === выводится в той же строке после Enter age: )
    • Примечание: Эта версия populateContact не проверяет длину номера телефона: не добавляйте такую проверку, поскольку в тестовых данных используются короткие номера, например 555-1234
  4. Написать функцию с именем displayContact, которая:
    • Принимает в качестве параметра указатель на константную структуру Contact: const struct Contact *contactPtr
    • Ничего не возвращает (void)
    • Выводит контактную информацию в следующем точном формате:
      • === CONTACT DETAILS ===
      • Name: [name]
      • Phone: [phone]
      • Email: [email]
      • Age: [age] years old
      • ========================
    • После вывода основных данных вычисляет и отображает дополнительную информацию:
      • Вычисляет длину имени с помощью strlen() и выводит: Name length: [length] characters
      • Определяет возрастную категорию и выводит:
        • Если возраст от 0 до 12: Generation: Child
        • Если возраст от 13 до 19: Generation: Teenager
        • Если возраст от 20 до 39: Generation: Young Adult
        • Если возраст от 40 до 59: Generation: Middle-aged Adult
        • Если возраст 60 или больше: Generation: Senior
      • Проверяет, содержит ли адрес электронной почты символ '@', с помощью strchr(), и выводит:
        • Если символ '@' найден: Email format: Valid
        • Если символ '@' не найден: Email format: Invalid
  5. В функции main:
    • Создать контакт с помощью функции createContact
    • Проверить, успешно ли создан контакт
    • Вызвать функцию populateContact, чтобы заполнить данные контакта
    • Вызвать функцию displayContact, чтобы вывести контактную информацию в форматированном виде
    • Освободить динамически выделенную память
    • Вывести Program completed successfully

Это задание демонстрирует, как создать функцию вывода, принимающую указатель на константную структуру, чтобы функция не могла изменять исходные данные. Вы попрактикуетесь в использовании fgets() для чтения строк с пробелами, strcspn() для удаления завершающих символов новой строки, оператора стрелки для доступа к полям структуры через указатель, strchr() для поиска символов и условной логики для категоризации данных. Использование const в объявлении параметра — хорошая практика, которая предотвращает случайное изменение данных контакта внутри функции вывода.

Попробуйте сами

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

Все уроки раздела Логика и управление потоком

Потренируйтесь самостоятельно: Онлайн-компилятор C