0%

C语言 使用struct描述一个学生

C语言的结构体

OK,这次我们来聊聊结构体。

任务来了,我想让你给学生建立一个数据库,该怎么来做。

这个学生包含的信息如下:

  • ID:也就是学号,唯一区别码,用整型表示
  • Name:姓名,用字符串表示
  • Age:年龄,用整型表示
  • Sex:性别,用字符串表示

按照目前学过的知识我们的代码如下,比如先来一个李雷同学的吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*beginner/struct/struct1.c*/
#include <stdio.h>

int main()
{
int lilei_id = 1;
char lilei_name[15] = "Li Lei";
int lilei_age = 18;
char lilei_sex[10] = "male";

printf("The student information :\n");
printf("ID \t | Name \t| Age\t| Sex \n");
printf("%d \t | %s \t| %d \t| %s \n", lilei_id, lilei_name, lilei_age, lilei_sex);

return 0;
}

好,刚开学没几天,来了另外一个同学,韩梅梅,从此浪漫的爱情,不,英语学习开始,我们把数据库更新一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*beginner/struct/struct2.c*/
#include <stdio.h>

int main()
{
int lilei_id = 1;
char lilei_name[15] = "Li Lei";
int lilei_age = 18;
char lilei_sex[10] = "male";

int hanmeimei_id = 2;
char hanmeimei_name[15] = "Han Meimei";
int hanmeimei_age = 17;
char hanmeimei_sex[10] = "female";

printf("The student information :\n");
printf("ID \t | Name \t| Age\t| Sex \n");
printf("%d \t | %s \t| %d \t| %s \n", lilei_id, lilei_name, lilei_age, lilei_sex);
printf("%d \t | %s \t| %d \t| %s \n", hanmeimei_id, hanmeimei_name, hanmeimei_age, hanmeimei_sex);

return 0;
}

发现了什么问题,是不是跟自定义函数类似,代码是简单,不过大部分都是重复的工作,没有显示度,没有创新。

如何办,C语言提供了一个结构体,允许用户自己建立由不同类型数据组成的组合型的数据结构,注意是不同类型不同类型

重要的事情说三遍。

先看一下结构体的声明吧,看看是何方神圣:

1
2
3
4
5
6
struct tag { 
member1
member2
member3
...
} list ;

具体是个什么含义:

  • struct:是结构体的声明类型
  • tag:是这个结构体的标记;
  • member:就是结构体的内容
  • list:是变量的列表

来个实例化吧,比如学生的定义就可以写成如下:

1
2
3
4
5
6
struct Student{
int id;
char name[10];
int age;
char sex[10];
}student;

从这个代码可以看出,结构体的tag首字母一般大写,结构体的内容类型不一样,结构体有个列表叫做student。

下面我们使用结构体来重构代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*beginner/struct/struct3.c*/
#include <stdio.h>

int main()
{

struct Student
{
int id;
char name[15];
int age;
char sex[10];
};

struct Student lilei = {1, "Li Lei", 18, "male"};
struct Student hanmeimei = {2, "Han Meimei", 17, "female"};

printf("The student information :\n");
printf("ID \t | Name \t| Age\t| Sex \n");
printf("%d \t | %s \t| %d \t| %s \n", lilei.id, lilei.name, lilei.age, lilei.sex);
printf("%d \t | %s \t| %d \t| %s \n", lilei.id, lilei.name, lilei.age, lilei.sex);

return 0;
}

有没有感觉,神清气爽,两袖清风,原来8行的代码,2行搞定,也就多了一个结构体的定义,在学生数以万计的时候,代码量减少了四分之三,这是在只有4个参数的情况下,参数越多越给力。

有几点说明:

  • 注意结构体的定义,有大括号,有分号
  • 注意结构体的初始化,需要使用struct Student s1这样的表示方式;
  • 注意结构体的初始化也是使用大括号,对应每个变量

编译运行

直接输入make就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#beginner/struct/Makefile
ALL : struct1 struct2 struct3

struct1: struct1.c
gcc -o struct1 struct1.c

struct2: struct2.c
gcc -o struct2 struct2.c

struct3: struct3.c
gcc -o struct3 struct3.c

.PHONY : clean

clean:
rm -f struct1 struct2 struct3

运行输出如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ ./struct1
The student information :
ID | Name | Age | Sex
1 | Li Lei | 18 | male

$ ./struct2
The student information :
ID | Name | Age | Sex
1 | Li Lei | 18 | male
2 | Han Meimei | 17 | female

$ ./struct3
The student information :
ID | Name | Age | Sex
1 | Li Lei | 18 | male
2 | Han Meimei | 17 | female
处无为之事,行不言之教;作而弗始,生而弗有,为而弗恃,功成不居!

欢迎关注我的其它发布渠道