创建联系人的函数
本课属于 Coddy C 学习旅程的“逻辑与流程”单元。第 51 课,共 63 课。
挑战
简单在上一课的 Contact 结构体基础上,创建一个函数,为新的联系人动态分配内存。你的程序应当:
- 使用上一课中相同的
Contact结构体定义,其中包含以下成员:- 一个大小为 50 的字符数组
name - 一个大小为 20 的字符数组
phone - 一个大小为 40 的字符数组
email - 一个整数
age
- 一个大小为 50 的字符数组
- 编写一个名为
createContact的函数,该函数:- 不接受任何参数
- 返回一个指向
Contact结构体的指针 - 使用
malloc()为一个Contact结构体动态分配内存 - 检查内存分配是否成功:
- 如果分配失败(返回 NULL),打印
Memory allocation failed并返回 NULL - 如果分配成功,打印
Contact created successfully
- 如果分配失败(返回 NULL),打印
- 使用箭头运算符将所有结构体成员初始化为默认值:
- 使用
contactPtr->name[0] = '\0';将name设为空字符串 - 使用
contactPtr->phone[0] = '\0';将phone设为空字符串 - 使用
contactPtr->email[0] = '\0';将email设为空字符串 - 使用
contactPtr->age = 0;将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;
}逻辑与流程中的所有课
自己练习: C 在线编译器