Функция для вывода контакта
Часть раздела Логика и управление потоком путешествия по C на Coddy. Урок 53 из 63.
Задание
ЛегкоОпираясь на систему управления контактами из предыдущих уроков, создайте функцию, которая отображает информацию о контакте в отформатированном виде. В этом уроке представлены три новые строковые функции, которые вам понадобятся: 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, если символ не найден.
Ваша программа должна:
- Использовать то же определение
Contactstruct, что и в предыдущих уроках, со следующими членами:- Массив символов
nameразмером 50 - Массив символов
phoneразмером 20 - Массив символов
emailразмером 40 - Целое число
age
- Массив символов
- Использовать ту же функцию
createContactиз предыдущих уроков, которая:- Динамически выделяет память для
Contactstruct - Инициализирует все члены значениями по умолчанию
- Возвращает указатель на контакт
- Динамически выделяет память для
- Написать функцию
populateContact, которая:- Принимает указатель на
Contactstruct в качестве параметра - Использует
fgets()для чтения каждого строкового поля (name, phone, email), чтобы можно было вводить имена с пробелами - Использует
strcspn()для удаления завершающего символа новой строки из каждого строкового поля после его чтения - Использует
scanf("%d", ...)для чтения целочисленного поля age - Примечание: Эта версия
populateContactне включает проверку длины номера телефона: не добавляйте её, поскольку в тестовых данных используются короткие номера телефонов, например555-1234
- Принимает указатель на
- Написать функцию с именем
displayContact, которая:- Принимает указатель-константу на
Contactstruct в качестве параметра: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
- Если возраст находится в диапазоне от 0 до 12:
- Проверяет, содержит ли email символ
'@', с помощьюstrchr()и выводит:- Если
'@'найден:Email format: Valid - Если
'@'не найден:Email format: Invalid
- Если
- Вычисляет длину имени с помощью
- Принимает указатель-константу на
- В функции main:
- Создать контакт с помощью функции
createContact - Проверить, было ли создание контакта успешным
- Вызвать функцию
populateContact, чтобы заполнить данные контакта - Вызвать функцию
displayContact, чтобы отобразить отформатированную информацию о контакте - Освободить динамически выделенную память
- Вывести
Program completed successfully
- Создать контакт с помощью функции
Эта задача демонстрирует, как создать функцию отображения, принимающую указатель-константу на struct, благодаря чему функция не сможет изменить исходные данные. Вы попрактикуетесь в использовании fgets() для чтения строк, содержащих пробелы, strcspn() для удаления завершающих символов новой строки, оператора стрелки для доступа к членам struct через указатель, 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;
}Все уроки раздела Логика и управление потоком
1Основы указателей
Что такое указатель?Объявление указателейОператор взятия адреса (&)Оператор разыменования (*)Указатели NULLИтоги: Основы указателей4Проект: Простая текстовая утилита
Обзор проектаПодсчет символов2Указатели и массивы
Имена массивов как указателиЭлементы массива — указателиАрифметика указателейСравнение указателейИтоги: Обход массива через указатели5Указатели и функции
Передача по значениюПередача указателей в функцииИзменение переменных через указателиКлассический пример: SwapПередача массивов в функцииИтоги: указатели как аргументы функций8Структуры и указатели
Указатели на структурыОператор «стрелка» (->)Передача структур по значениюПередача указателей на структурыДинамическое выделение памяти для структурИтоги: Изменение структур через указатели11Итоговые задачи на повторение
Повторение: динамическая конкатенация строкПовторение: массив структурПовторение: счетчик частоты слов3Символьные массивы и строки
Строки как массивы charНуль-терминаторВвод строк с помощью scanfИспользование strlen()Использование strcpy()Использование strcat()Использование strcmp()Итоги: основные строковые функции6Управление памятью
Стек против кучиДинамическое выделение — malloc()Использование sizeof() для выделения памятиПроверка ошибок выделения памятиОсвобождение памяти с помощью free()Выделение памяти с помощью calloc()Итоги: Динамический массив9Проект: Простой ввод контактов
Проект: Определение структуры ContactФункция для создания контактаПотренируйтесь самостоятельно: Онлайн-компилятор C