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