Menu
Coddy logo textTech

Функция для создания контакта

Часть раздела Logic & Flow путешествия по C на Coddy — урок 51 из 63.

challenge icon

Задание

Легко

Опираясь на вашу структуру Contact из предыдущего урока, создайте функцию, которая динамически выделяет память для нового контакта. Ваша программа должна:

  1. Использовать то же определение структуры Contact из предыдущего урока со следующими полями:
    • Символьный массив name размером 50
    • Символьный массив phone размером 20
    • Символьный массив email размером 40
    • Целое число age
  2. Написать функцию с именем createContact, которая:
    • Не принимает параметров
    • Возвращает указатель на структуру Contact
    • Использует malloc() для динамического выделения памяти для одной структуры Contact
    • Проверяет, было ли выделение памяти успешным:
      • Если выделение не удалось (возвращает NULL), выводит Memory allocation failed и возвращает NULL
      • Если выделение прошло успешно, выводит Contact created successfully
    • Инициализирует все поля структуры значениями по умолчанию, используя оператор «стрелка»:
      • Устанавливает name в пустую строку, используя contactPtr->name[0] = '\0';
      • Устанавливает phone в пустую строку, используя contactPtr->phone[0] = '\0';
      • Устанавливает email в пустую строку, используя contactPtr->email[0] = '\0';
      • Устанавливает age в 0, используя contactPtr->age = 0;
    • Возвращает указатель на только что созданный контакт
  3. В функции main:
    • Объявить указатель на структуру Contact с именем newContact
    • Вызвать функцию createContact и присвоить возвращенный указатель переменной newContact
    • Проверить, было ли создание контакта успешным:
      • Если newContact равен NULL, вывести Failed to create contact и завершить выполнение программы
      • В случае успеха вывести Contact initialized with default values
    • Отобразить инициализированную информацию о контакте, используя оператор «стрелка» в точно таком формате:
      • Default Contact Values:
      • Name: [name] (будет пустым)
      • Phone: [phone] (будет пустым)
      • Email: [email] (будет пустым)
      • Age: [age] (будет 0)
    • Освободить динамически выделенную память с помощью free(newContact)
    • Вывести Memory freed successfully

Эта задача знакомит с концепцией фабричных функций — функций, которые создают и возвращают указатели на динамически выделенные структуры. Вы попрактикуетесь в динамическом выделении памяти, правильной проверке ошибок, инициализации структур через указатели и очистке памяти.

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

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

Все уроки раздела Logic & Flow