-
题目信息:
为了方便后续多次输入不同的学生信息,采用结构体来完成。
添加目录方便食用
- 结构体的使用
- 一些补充及易错点说明
- 题目答案
- 题目扩展——数据对齐(“-”与“.”的区分)
-
结构体的使用
- 结构体构建
在C语言中,我们可以使用struct关键字来定义结构体。以下是一个包含数组成员的结构体的示例:
struct Student {
char name[20];
int age;
float scores[5];
};
在上面的示例中,我们定义了一个名为Student的结构体,它包含了三个成员变量:name、age和scores。其中,name成员是一个长度为20的字符数组,age成员是一个整型变量,scores成员是一个包含5个浮点数元素的数组。
通过这种方式,我们可以使用结构体来将相关的数据项组织在一起,从而实现更灵活、可读性更好的代码编写。
- 结构体定义
要在编程中对结构体的数组部分进行定义,可以使用如下语法:
struct Student students[5] = {
{"Tom", 18, {92.5, 81.0, 87.5, 89.0, 95.0}},
{"Jerry", 19, {88.0, 79.0, 86.5, 93.0, 91.0}},
{"Alice", 20, {91.0, 83.5, 88.0, 78.5, 90.0}},
{"Bob", 19, {85.5, 87.5, 90.0, 84.5, 92.5}},
{"Lily", 18, {93.0, 82.5, 84.5, 88.0, 89.5}}
};
在上面的示例中,我们定义了一个包含5个Student类型元素的数组,每个元素由姓名、年龄和一维浮点数数组组成。使用{}初始化列表可以给数组中的每个元素分别赋值。
除了使用初始化列表之外,还可以使用循环遍历数组,并依次为每个元素赋值。例如:
struct Student students[5];
for (int i = 0; i < 5; i++) {
strcpy(students[i].name, "Unknown");
students[i].age = 0;
for (int j = 0; j < 5; j++) {
students[i].scores[j] = 0;
}
}
在上面的示例中,我们使用循环为每个元素的成员变量分别赋初始值。这样定义后,就可以在程序中使用students数组来存储一组学生信息了。
-
一些补充及易错点说明
- 字符数组的定义(补充)
结构体中的字符数组可以使用初始化列表或者字符串赋值的方式进行初始化。下面是两种初始化方式的示例:
①使用初始化列表初始化结构体中的字符数组
struct Person {
char name[20];
int age;
float height;
};
struct Person p1 = {"Alice", 20, 170.5};
在上述示例中,我们使用了初始化列表来初始化结构体变量p1。字符串"Alice"被赋值给了p1.name成员变量,其它成员变量也被依次赋值。
②在定义结构体变量后,通过字符串赋值来初始化结构体中的字符数组
struct Person {
char name[20];
int age;
float height;
};
struct Person p1;
strcpy(p1.name, "Alice");
p1.age = 20;
p1.height = 170.5;
在上述示例中,我们先定义了一个空的结构体变量p1,然后使用strcpy函数将字符串"Alice"赋值给了p1.name成员变量,其它成员变量也被依次赋值。
③单独对结构体字符数组的其中一个元素进行初始化不可以使用 “ = ” 吗?
可以使用赋值运算符=对结构体字符数组的单个元素进行赋值初始化,例如:
struct Person {
char name[20];
int age;
float height;
};
struct Person p1;
p1.name[0] = 'A';
在上述示例中,我们对结构体变量p1的name成员变量的第一个元素进行了初始化,将其赋值为字符'A'。
需要注意的是,如果想要对整个结构体字符数组进行初始化,应该使用字符串初始化方法,即使用strcpy函数或者等号赋值方式进行初始化。而对于单个字符元素的初始化,则可以使用赋值运算符。
- 易错点
在C语言中,结构体的定义不一定要放在 main 函数之前。但是,为了养成良好的编程习惯,在实际编程中通常建议将结构体的定义放在所有函数之前或者单独放在一个头文件中,以便于程序的管理和维护。同时,需要注意的是,在使用结构体之前必须对其进行定义或声明,否则编译器无法识别该结构体类型。
结构体格式:
struct Student {
char name[20];
int age;
float scores[5];
};
需要注意的是结构体后直接跟 {} 且结构体后面别忘了加 ; 。
-
题目答案
#include <stdio.h>
struct person {
char name[20];
int age;
char gender[20];
};
int main() {
struct person a = { "Jack", 18, "man" };
printf("Name Age Gender\n");
printf("---------------------\n");
printf("%-4s %-3d %-4s\n", a.name, a.age, a.gender);
return 0;
}
-
题目扩展——数据对齐
- 数据对齐
如果您需要在输出整数时,保证输出的字符数为3个,并且将整数放在前面,后面留有空格,可以使用宽度字段来实现。例如:
int num = 18;
printf("%-3d\n", num);
在上述示例中,我们使用了%-3d来格式化输出整数num,其中 - 表示左对齐, 3 表示输出的宽度为3个字符,不足3个字符时,在数值右边用空格填充。
需要注意的是,如果输出的整数超过指定的宽度,仍然会以实际的长度输出。
- “ - ”与“ . ”的区别(“ - ”表示左对齐而“ . ”表示精度吗?)
不完全正确。在格式化字符串中, - 表示左对齐,而 . 表示精度。
精度是用于控制浮点数和字符串输出长度的一个格式化参数。对于浮点数来说,精度指定了输出的小数位数;对于字符串来说,精度指定了输出的最大字符数。
下面是几个例子:
double num = 3.14159265359;
printf("%.2lf\n", num); // 输出: 3.14
char str[] = "Hello, world!";
printf("%.6s\n", str); // 输出: Hello,
在上述示例中,%.2lf表示输出num的小数点后保留2位,%.6s表示输出str的前6个字符。
需要注意的是,在某些情况下, . 也可以表示占位符(placeholder),这时候它后面跟随的数字并不表示精度,而是用于输出整数字段的宽度。例如:
int num = 123;
printf("%05d\n", num); // 输出: 00123
在上述示例中,%05d表示输出num的宽度为5个字符,不足5个字符时,在数值左边用0填充。