Функция для создания контакта
Часть раздела Logic & Flow путешествия по C на Coddy — урок 51 из 63.
Задание
ЛегкоОпираясь на вашу структуру Contact из предыдущего урока, создайте функцию, которая динамически выделяет память для нового контакта. Ваша программа должна:
- Использовать то же определение структуры
Contactиз предыдущего урока со следующими полями:- Символьный массив
nameразмером 50 - Символьный массив
phoneразмером 20 - Символьный массив
emailразмером 40 - Целое число
age
- Символьный массив
- Написать функцию с именем
createContact, которая:- Не принимает параметров
- Возвращает указатель на структуру
Contact - Использует
malloc()для динамического выделения памяти для одной структурыContact - Проверяет, было ли выделение памяти успешным:
- Если выделение не удалось (возвращает NULL), выводит
Memory allocation failedи возвращает NULL - Если выделение прошло успешно, выводит
Contact created successfully
- Если выделение не удалось (возвращает NULL), выводит
- Инициализирует все поля структуры значениями по умолчанию, используя оператор «стрелка»:
- Устанавливает
nameв пустую строку, используяcontactPtr->name[0] = '\0'; - Устанавливает
phoneв пустую строку, используяcontactPtr->phone[0] = '\0'; - Устанавливает
emailв пустую строку, используяcontactPtr->email[0] = '\0'; - Устанавливает
ageв 0, используяcontactPtr->age = 0;
- Устанавливает
- Возвращает указатель на только что созданный контакт
- В функции 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
1Основы указателей
Что такое указатель?Объявление указателейОператор взятия адреса (&)Оператор разыменования (*)Указатели NULLИтоги: Основы указателей4Проект: Простая текстовая утилита
Обзор проектаПодсчет символов2Указатели и массивы
Имена массивов как указателиЭлементы массива — указателиАрифметика указателейСравнение указателейИтоги: Обход массива через указатели5Указатели и функции
Передача по значениюПередача указателей в функцииИзменение переменных через указателиКлассический пример: SwapПередача массивов в функцииИтоги: указатели как аргументы функций8Структуры и указатели
Указатели на структурыОператор «стрелка» (->)Передача структур по значениюПередача указателей на структурыДинамическое выделение памяти для структурИтоги: Изменение структур через указатели11Итоговые задачи на повторение
Повторение: динамическая конкатенация строкПовторение: массив структурПовторение: счетчик частоты слов3Символьные массивы и строки
Строки как массивы charНуль-терминаторВвод строк с помощью scanfИспользование strlen()Использование strcpy()Использование strcat()Использование strcmp()Итоги: основные строковые функции6Управление памятью
Стек против кучиДинамическое выделение — malloc()Использование sizeof() для выделения памятиПроверка ошибок выделения памятиОсвобождение памяти с помощью free()Выделение памяти с помощью calloc()Итоги: Динамический массив9Проект: Простой ввод контактов
Проект: Определение структуры ContactФункция для создания контакта