我们之前已经学习了,整型变量、字符型变量、浮点型变量等存储数据的类型和定义,但是有些时候我们需要更复杂的变量结构来表示一些数据结构。
今天我们来学习两种关于数据的存储及使用的方法,即数组和结构体。以及一个格式输出的函数sprintf。
一、我们首先来看一下数组:
数组,简单来说就是一组有序的、类型相同的数据的集合。
定义: 类型 数组名[常量]
例:
定义一个整型类型的数组并赋初值:
int num[3]={0,1,2};
此数组的名称是num,并且数组的长度为3,即有3个元素,分别是num[0],num[1],num[2],
那么:
num[0] 的数据值就是 0,
num[1]的数据值就是1,
num[2]的数据值就是2.
我们可以看出,数组元素的下标是从0开始的。
数组元素就相当于一个变量,可以给它赋值,如:
num[0] = 3;
num[1] = 4;
num[2] = 5;
那么相应的元素的值就改变了。我们可以用printf 函数输出验证:
#include <stdio.h>
int main()
{
int num[3]={0,1,2};
printf("num[0] = %d, num[1] = %d, num[2] = %d \n", num[0], num[1], num[2]);
num[0] = 3;
num[1] = 4;
num[2] = 5;
printf("num[0] = %d, num[1] = %d, num[2] = %d \n", num[0], num[1], num[2]);
return 0;
}
我们可以在输出结果中看到数组中的值发生了变化,如下图:
当然,数组的类型也可以是之前的float型,char型,以及C语言有的其它数据类型。
需要注意的几个点:
1、 数组定义时,也可以不定义长度,而由初始化的值来决定。
例: char str[ ] = “hello”;
2、 定义字符型数组并赋初值时,可以省略外边的大括号,如1所示,而且系统会在末尾自动加上一个字符‘\0’, 来用作结束符。
3、 在输出打印字符串的时候,可以使用字符数组来完成,即:
printf(“string value is %s\n”, str);
例:
#include <stdio.h>
int main()
{
char str[ ] = "hello";
printf("string value is %s\n", str);
return 0;
}
运行结果:
小知识:当调用printf函数打印字符串的时候,当程序遇到字符‘\0’会认为字符串已到末尾,即使字符‘\0’后还有字符,也将不再打印。举例说明:
#include <stdio.h>
int main()
{
char str[ ] = "hello\0hahaha";
printf("string value is %s\n", str);
return 0;
}
运行结果:
我们看到即使,字符串为"hello\0hahaha",但是字符‘\0’后的字符却没有打印。
二维数组
上边讲的是一维的数组,还有一种叫二维数组,我们来看一下:
定义一个3行 3列的二维数组并赋初值,例子:
int num[3][3] = { {1,2,3}, {4,5,6}, {7,8,9} };
或者
int num[3][3] ={ 1, 2, 3,
4, 5, 6,
7, 8, 9 };
当然二维数组的下标也是从0开始,即本二维数组元素的下标,是0、1、2
即num[0][0], num[0][1],num[0][2] ......... num[2][0],num[2][1],num[2][2]
我们用一个完整例子来体会一下:
#include <stdio.h>
int main()
{
int num[3][3] = { {1,2,3}, {4,5,6}, {7,8,9} };
int i , j;
for(i=0;i<3; i++)
{
for(j=0;j<3; j++)
{
printf("num[%d][%d] value is %d\n",i, j, num[i][j] );
}
}
return 0;
}
运行结果如下:
注意:当我们定义了一个二维数组num[3][3], 二维数组元素的下标,是0、1、2,即数组元素的下标最大值是数组长度减一,比如,我们定义一个二维数组num[3][4], 即,数组元素的横向的下标是,0、1、2,纵向的下标是0、1、2、3.
二、再来看一下结构体:
数组是一个有顺序,并且类型相同的一组数据的集合,那么如果我们想把几个类型不同的数据放到一起怎么办呢?
比如:一个学生的 姓名、年龄、成绩,它们分别是由不同的数据类型组成,即姓名是字符串数据,年龄是整型数据,成绩是浮点型(小数)型数据。这个时候我们就可以使用结构体来实现。
1、结构体的定义:
struct 结构体名
{
成员列表;
};
例如定义一个学生的结构体:
struct student
{
char name[32]; //姓名
int age; //年龄
float score; //成绩
};
2、定义结构体变量
struct student student1, student 2;
以上就定义了两个student类型的结构体变量 student1和student2,这两个变量就可以代表两个学生,他们都拥有姓名、年龄、成绩这三个成员。
结构示例:
3、定义结构体并同时定义结构体变量
struct student
{
char name[32]; //姓名
int age; //年龄
float score; //成绩
} student1, student2;
4、 定义结构体并同时定义结构体变量,并赋初值
struct student
{
char name[32]; //姓名
int age; //年龄
float score; //成绩
} student1,={“Zhang”, 19, 90.5};
5、结构体变量及成员的引用
结构体不能进行整体的输入和输出,需要对其成员一一操作,引用格式如下:
结构体变量名.成员名
即结构体变量名和成员中间有个小黑点即英文的句号,使用这样的方式进行引用。
例如:给结构体成员赋值
student1.age = 19;
student1.score =91.5;
打印输出结构体成员:
printf(“student1:name = %s, age = %d, score = %f\n”, student1.name, student1.age, student1.score);
6、 结构体数组
即数组的类型是结构体类型,例:
首先定义结构体
struct student
{
char name[32]; //姓名
int age; //年龄
float score; //成绩
};
再定义结构体数组变量
struct student stu[2];
即stu[0]、stu[1]两个数组元素都是结构体 student类型的变量。
举个完整例子:
#include <stdio.h>
int main()
{
struct student
{
char name[32]; //姓名
int age; //年龄
float score; //成绩
};
struct student stu[2]; //定义结构体数组
//给结构体数组元素 stu[0] 中的结构体成员一一赋值
sprintf(stu[0].name,"%s","Zhang san");
stu[0].age =20;
stu[0].score= 96.5;
//给结构体数组元素 stu[1] 中的结构体成员一一赋值
sprintf(stu[1].name,"%s","Lisi");
stu[1].age =21;
stu[1].score= 98.5;
//打印输出 stu[0]、 stu[1]中成员的值
printf("stu[0]: name = %s, age = %d, score = %0.2f\n",stu[0].name, stu[0].age, stu[0].score);
printf("stu[1]:name = %s, age = %d, score = %0.2f\n", stu[1].name, stu[1].age, stu[1].score);
return 0;
}
输出结果:
三、sprintf 函数
函数功能:即将格式化后的数据拷贝到某个字符串数据区内
用例子说明:
#include <stdio.h>
int main()
{
char str[100];
struct student
{
char name[32]; //姓名
int age; //年龄
float score; //成绩
}student1 ={"Zhang", 19, 90.5};
sprintf(str,"%s","helloworld");
printf("%s\n", str);
sprintf(str,"The student`s name is %s",student1.name);
printf("%s\n", str);
sprintf(str,"The student`s age is %d",student1.age);
printf("%s\n", str);
sprintf(str,"The student`s score is %0.2f",student1.score);
printf("%s\n", str);
return 0;
}
运行结果如下:
程序中运用了四次 sprintf函数,分别将 字符串,整型数据,浮点型数据进行格式输出到 str 这个字符数组中,然后运用同样的输出语句:printf("%s\n", str);来进行输出。
大家在电脑上实际运行一下,仔细观察和体会一下格式输出的特点。
这样C语言中的数组、结构体、sprintf函数 就讲完了,大家自己一定要动手把例子全部敲一遍,多练习才能快速掌握。加油!
欢迎大家关注公众号“创小董”我会继续分享更多经历、经验、解决办法。