C语言通过键盘输入给结构体内嵌的结构体赋值——指针法

1 需求

以录入学生信息(姓名、学号、性别、出生日期)为例,首先通过键盘输入需要录入的学生的数量,再依次输入这些学生的信息,输入完成后输出所有信息。

2 代码

#include<stdio.h>
#include<stdlib.h>

// 定义结构体,并取别名为Date 
typedef struct {
	int year;
	int month;
	int day;
}Date; 

// 定义结构体,并取别名为Student 
typedef struct {
	char name[9];
	char number[5];
	char sex[3];
	Date birthday; // 内嵌结构体Date 
}Student;

int main() {
	int count;
	printf("请输入需要录入的学生数量:");
	scanf("%d", &count);
	
	printf("\n请依次输入每个学生的信息:\n\n姓名\t学号\t性别\t出生日期\n");
	
	// 由于不能使用变量定义数组Student stuArray[count];
	// 所以采用指针,并通过动态内存分配来实现 
	// 在堆中申请一部分连续的内存空间用来存储输入的信息 
	// 并使Student *类型的指针变量stuPoint指向此空间的首地址
	Student *stuPoint = (Student*)malloc(count * sizeof(Student));
	
	// 动态内存分配可能失败,若失败,则程序直接退出 
	if (stuPoint == NULL) {
        exit(1);
    }
    
    // 定义第二个指针stuTempPoint1,使它和stuPoint指向同一个位置 
	// 当输入完一个学生后,stuTempPoint1往下移,直至输入完所有学生
	// 输入完所有学生后,该指针就指向了没有学生信息的位置(相当于“废了”)
	// 其实呢,也可以继续用,只要再往上移,移回去就行了
	Student *stuTempPoint1 = stuPoint;
	for(int i = 0; i < count; i++, stuTempPoint1++) {
		scanf("%s%s%s%d%d%d", 
			stuTempPoint1 -> name, 
			stuTempPoint1 -> number, 
			stuTempPoint1 -> sex, 
			&stuTempPoint1 -> birthday.year, 
			&stuTempPoint1 -> birthday.month,
			&stuTempPoint1 -> birthday.day
		);
	}
	
	printf("\n\n================================\n\n");
		
	// 定义第三个指针stuTempPoint2,使它和stuPoint指向同一个位置 
	// 每输出完一个学生信息后,指针下移,全部输出完毕后该指针也相当于“跪了”
	Student *stuTempPoint2 = stuPoint;
	for(int i = 0; i < count; i++, stuTempPoint2++) {
		printf("姓名:%s\t学号:%s\t性别:%s\t出生日期:%d年%d月%d日\n", 
			stuTempPoint2 -> name, 
			stuTempPoint2 -> number, 
			stuTempPoint2 -> sex, 
			stuTempPoint2 -> birthday.year, 
			stuTempPoint2 -> birthday.month,
			stuTempPoint2 -> birthday.day
		);
	}
	
	printf("\n\nstuTempPoint1指针往上移之后,再次利用================================\n\n");
	
	// 回到原始位置 
	stuTempPoint1 -= count;

	// 再一顿输出 
	for(int i = 0; i < count; i++, stuTempPoint1++) {
		printf("姓名:%s\t学号:%s\t性别:%s\t出生日期:%d年%d月%d日\n", 
			stuTempPoint1 -> name, 
			stuTempPoint1 -> number, 
			stuTempPoint1 -> sex, 
			stuTempPoint1 -> birthday.year, 
			stuTempPoint1 -> birthday.month,
			stuTempPoint1 -> birthday.day
		);
	}

	// 释放刚刚申请的内存空间(一定要释放!) 
	free(stuPoint);
	
	return 0;
}

3 运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值