C语言中建立数据类型-定义结构体数组-学习笔记-47

引入

前面,我们学习了如何声明一个结构体类型和初始化结构体变量,那么数组能不能设置为结构体类型呢?答案是肯定的,这就是结构体数组。结构体数组和普通数组的最大区别就是,每个数组元素其实都是一个结构体类型的数据,因为数组是结构体类型。

例子

三个候选人,10张选票,我们设计一个统计选票的程序,输入10个选票的结果,输出统计数量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <string.h>
int main(){
struct People{
char name[20];
int count;
}leader[3]={"a",0,"b",0,"c",0};
char leader_name[20];
for (int i=0;i<10;i++){
scanf("%s",leader_name);
for (int j=0;j<3;j++){
if(strcmp(leader_name,leader[j].name)==0){
leader[j].count++;
}
}
}
printf("最终结果是:\n");
for(int i=0;i<3;i++){
printf("%s 获得 %d 票 !\n",leader[i].name,leader[i].count);
}
return 0;
}

运行结果是:

a
b
a
a
a
c
c
c
b
a
最终结果是:
a 获得 5 票 !
b 获得 2 票 !
c 获得 3 票 !

我们定义了一个结构体数组 leader ,数组包含3个元素,每一个元素都是一个结构体,所以,每一个元素又包含两个结构体成员 name 和 count 。

1
2
3
4
5
6
7
8
leader[3]={"a",0,"b",0,"c",0};
//上面等同于下面
leader[0].name="a";
leader[0].count=0;
leader[1].name="b";
leader[1].count=0;
leader[2].name="c";
leader[2].count=0;

这里虽然只有三个元素,但每个元素又包含两个结构体,所以我们要这样给数组赋值。

在主函数中,我们要求输入被投票的人名,每次循环获得一个认命,然后再从这个循环中增加一个 3 次的循环,判断输入的这个人名和备选的三个人中的哪个相匹配,匹配的人的 count 自加。

注意
scanf 输入的是一个字符串,赋值给了字符数组,数组名就是这个数组首元素地址
leader[j].name 也是一个字符数组,同样是首元素地址。
所以,指针之间要进行比较,需要用到strcmp 函数

定义结构体数组

一般形式

struct 结构体名
{成员列表} 数组名[数组长度]

我们也可以线定一个结构体类型,然后再声明数组。

1
2
struct people leader_name[3];
//定义了一个数组,其类型是结构体类型,每个数组元素包含结构体类型中的所有成员

我们也可以再定义结构体数组的时候初始化该数组

1
struct people leader[3]={"a",0,"b",0,"c",0};

其实,最重要的就是明白,无论是什么,它还是一个数组,这个数组的每一个元素,都可以理解为一个结构体指针变量,变量中包含结构体的所有成员。

尾巴

这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。


-------------The End-------------
欢迎请我喝咖啡哦~!