C语言核心语法---数组、结构体、sprintf函数

本文详细介绍了C语言中的数组和结构体的定义、使用方法,包括一维数组、二维数组、结构体的定义、赋值及引用。此外,还讲解了sprintf函数的使用,通过实例展示了如何将格式化的数据输出到字符串中。建议读者动手实践,以加深理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们之前已经学习了,整型变量、字符型变量、浮点型变量等存储数据的类型和定义,但是有些时候我们需要更复杂的变量结构来表示一些数据结构。

 

今天我们来学习两种关于数据的存储及使用的方法,即数组和结构体。以及一个格式输出的函数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函数 就讲完了,大家自己一定要动手把例子全部敲一遍,多练习才能快速掌握。加油!

欢迎大家关注公众号“创小董”我会继续分享更多经历、经验、解决办法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值