Menu
Coddy logo textTech

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

Часть раздела Логика и управление потоком путешествия по 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;
}

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

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