Hàm tạo liên hệ
Thuộc phần Logic và luồng điều khiển trong hành trình C của Coddy. Bài học 51 trên 63.
Thử thách
DễDựa trên struct Contact từ bài học trước, hãy tạo một hàm cấp phát động bộ nhớ cho một liên hệ mới. Chương trình của bạn cần:
- Dùng cùng định nghĩa struct
Contacttừ bài học trước với các thành viên:- Một mảng ký tự
namecó kích thước 50 - Một mảng ký tự
phonecó kích thước 20 - Một mảng ký tự
emailcó kích thước 40 - Một số nguyên
age
- Một mảng ký tự
- Viết một hàm tên là
createContactđể:- Không nhận tham số nào
- Trả về con trỏ đến struct
Contact - Dùng
malloc()để cấp phát động bộ nhớ cho một structContact - Kiểm tra xem việc cấp phát bộ nhớ có thành công không:
- Nếu cấp phát thất bại (trả về NULL), in ra
Memory allocation failedvà trả về NULL - Nếu cấp phát thành công, in ra
Contact created successfully
- Nếu cấp phát thất bại (trả về NULL), in ra
- Khởi tạo tất cả thành viên của struct bằng giá trị mặc định thông qua toán tử mũi tên:
- Đặt
namethành chuỗi rỗng bằng cách dùngcontactPtr->name[0] = '\0'; - Đặt
phonethành chuỗi rỗng bằng cách dùngcontactPtr->phone[0] = '\0'; - Đặt
emailthành chuỗi rỗng bằng cách dùngcontactPtr->email[0] = '\0'; - Đặt
agethành 0 bằng cách dùngcontactPtr->age = 0;
- Đặt
- Trả về con trỏ đến liên hệ vừa tạo
- Trong hàm main:
- Khai báo một con trỏ đến struct
Contacttên lànewContact - Gọi hàm
createContactvà gán con trỏ được trả về chonewContact - Kiểm tra xem việc tạo liên hệ có thành công không:
- Nếu
newContactlà NULL, in raFailed to create contactvà thoát chương trình - Nếu thành công, in ra
Contact initialized with default values
- Nếu
- Hiển thị thông tin liên hệ đã khởi tạo bằng toán tử mũi tên theo đúng định dạng sau:
Default Contact Values:Name: [name](sẽ để trống)Phone: [phone](sẽ để trống)Email: [email](sẽ để trống)Age: [age](sẽ là 0)
- Giải phóng bộ nhớ đã cấp phát động bằng
free(newContact) - In ra
Memory freed successfully
- Khai báo một con trỏ đến struct
Thử thách này giới thiệu khái niệm hàm nhà máy (factory function), tức là các hàm tạo và trả về con trỏ đến struct được cấp phát động. Bạn sẽ luyện tập cấp phát bộ nhớ động, kiểm tra lỗi đúng cách, khởi tạo struct thông qua con trỏ và dọn dẹp bộ nhớ.
Tự làm thử
#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;
}Tất cả bài học trong Logic và luồng điều khiển
1Nền tảng về con trỏ
Con trỏ là gì?Khai báo con trỏToán tử lấy địa chỉ (&)Toán tử giải tham chiếu (*)Con trỏ NULLÔn tập: kiến thức cơ bản về con trỏ4Dự án: Công cụ xử lý văn bản đơn giản
Tổng quan dự ánĐếm ký tự2Con trỏ và mảng
Tên mảng dưới dạng con trỏPhần tử mảng và con trỏPhép toán con trỏSo sánh con trỏÔn tập: duyệt mảng bằng con trỏ5Con trỏ và hàm
Truyền theo giá trịTruyền con trỏ vào hàmSửa đổi biến qua con trỏVí dụ kinh điển: hoán đổiTruyền mảng vào hàmÔn tập: đối số con trỏ hàm3Mảng ký tự và chuỗi
Chuỗi dưới dạng mảng charKý tự kết thúc nullNhập chuỗi bằng scanfDùng strlen()Dùng strcpy()Dùng strcat()Dùng strcmp()Ôn tập: các hàm xử lý chuỗi cơ bản6Quản lý bộ nhớ
Bộ nhớ ngăn xếp và bộ nhớ heapCấp phát động với malloc()Dùng sizeof() để cấp phátKiểm tra lỗi cấp phátGiải phóng bộ nhớ với free()Cấp phát với calloc()Ôn tập: Mảng động9Dự án: Nhập thông tin liên hệ đơn giản
Định nghĩa struct ContactHàm tạo liên hệTự luyện tập: Trình biên dịch C online